Marklogic 下载文件,文件名
我想提供一个带有文件下载的浏览器,在这里我使用Marklogic 下载文件,文件名,marklogic,Marklogic,我想提供一个带有文件下载的浏览器,在这里我使用XQuery设置文件名。在本例中,我将文件名设置为“example.txt” 输出名称为:“docmaker”,这不是我想要的 要实现这一点,正确的标头配置是什么 declare %roxy:params("ID=xs:number") function strlf:get( $context as map:map, $params as map:map ) as document-node()* { map:put($context, "out
XQuery
设置文件名。在本例中,我将文件名设置为“example.txt”
输出名称为:“docmaker”,这不是我想要的
要实现这一点,正确的标头配置是什么
declare
%roxy:params("ID=xs:number")
function strlf:get(
$context as map:map,
$params as map:map
) as document-node()*
{
map:put($context, "output-types", "application/csv"),
map:put($context, "Content-Disposition", 'attachment; filename="example.txt"'),
xdmp:set-response-code(200, "OK"),
document {
try {
let $id := map:get($params,"ID")
let $query :=
if (fn:empty($id))
then ()
else cts:element-range-query(xs:QName("jbasic:ID"),"=",(fn:number($id)))
for $doc in cts:search(fn:doc(), cts:and-query((cts:directory-query("/app/docmaker/"),$query)), ('unfiltered'))
return $doc//jbasic:Text/text()
}
catch ($e) {
element error { $e/error:message }
}
}
};
查看文档,REST extensions中既不支持Content Disposition标头,也不支持任何其他自定义标头: 我也看不到其他解决办法。内置的documents端点不提供自己的下载功能,并且转换通过相同的框架,因此也不起作用 我建议提交一份RFE。这可能对您个人没有帮助(您必须等待下一个版本),但对将来的其他人可能有用 **更新** @在下面的一个工作示例中,mblakele的建议是有效的。不过我不愿意推荐它。添加响应头可以工作,但设置响应代码不能。REST-API将覆盖它。添加响应头调用以后也可能发生同样的情况
xquery version "1.0-ml";
module namespace ext = "http://marklogic.com/rest-api/resource/download";
declare default function namespace "http://www.w3.org/2005/xpath-functions";
declare namespace roxy = "http://marklogic.com/roxy";
declare namespace xs = "http://www.w3.org/2001/XMLSchema";
declare option xdmp:mapping "false";
declare
%roxy:params("ID=xs:number")
function ext:get(
$context as map:map,
$params as map:map
) as document-node()*
{
map:put($context, "output-types", "application/csv"),
xdmp:add-response-header("Content-Disposition", 'attachment; filename="example.txt"'),
xdmp:set-response-code(300, "OK"),
document {
try {
doc()[1]
} catch ($e) {
element error { $e/error:message }
}
}
};
嗯 这看起来像一个Roxy应用程序,不确定是否使用了ML Rest扩展。 我会在Roxy网站上发布一个问题 或发送到MarkLogic通用邮件列表 MarkLogic开发人员讨论 Roxy是开发人员产品,不是正式的MarkLogic产品
如果编写一个“纯”HTTP应用程序,那么您的技术就可以工作了。我不知道您还需要Roxy的哪些其他功能,您能否在不更改其余功能的情况下将此特定端点设置为纯HTTP端点?请尝试直接调用,而不是调用
map:put
。可能不需要设置响应代码:除非出现错误,否则它应该默认为200ok
我不确定roxy是如何处理
$context
项的,但我没有看到任何代码会自动将其转换为响应头。它实际上是一个普通的REST-API扩展。Roxy注释只是帮助Roxy使用正确的参数信息进行部署。$context
的处理不是由Roxy完成的,而是由MarkLogic本身的REST-API完成的。也就是说,xdmp:add response header确实可以工作,尽管它有点绕过REST-API强加的框架。不幸的是,也不能保证它将来会继续工作……我认为它足够安全了。RESTAPI覆盖响应代码的原因是它调用xdmp:set response code
本身。如果RESTAPI提供了调用xdmp:addresponseheader
的机制,它可能不会覆盖其他代码已经设置的头。您只需担心REST API可能希望自己设置的头:可能是ETag或Content-Type。它实际上是一个普通的REST-API扩展。Roxy注释只是帮助Roxy使用正确的参数信息来部署它。关键的区别在于只有一个响应代码,RESTAPI通常需要设置它。但是RESTAPI不太可能单独设置内容配置
。例如,与响应直接交互将不再可能。不太可能很快,但你永远不知道。如果RESTAPI支持通过$context添加响应头,则更好,因此建议提交RFE。而且这样做的人越多,它很快就会被添加。。