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。而且这样做的人越多,它很快就会被添加。。