下载文件,文件名

时间:2014-07-07 08:58:08

标签: marklogic

我想提供一个带文件下载的浏览器,我使用XQuery设置文件名。在此示例中,我将文件名设置为“ example.txt ”。

输出fiename是:' 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 }
          }
    }
};  

3 个答案:

答案 0 :(得分:2)

查看文档,REST扩展中支持Content-Disposition标头或任何其他自定义标头:

http://docs.marklogic.com/guide/rest-dev/extensions#id_84661

我也没有看到其他方法。内置文档端点不提供自己的下载功能,并且转换通过相同的框架,因此也不会工作。

我建议提交RFE。这可能对您个人没有帮助(您必须等待下一个版本之一),但将来可能对其他人有用..

<强> **更新**

@ mblakele的建议有效,下面是一个工作示例。我不情愿地推荐它。 add-response-header有效,但是set-response-code没有。 REST-API将覆盖它。将来可能会发生相同的add-response-header调用..

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 }
    }
  }
};

HTH!

答案 1 :(得分:1)

请尝试直接致电https://docs.marklogic.com/xdmp:add-response-header,而不是致电map:put。可能无需设置响应代码:除非出现错误,否则默认为200 OK

我不确定roxy如何处理$context项,但我没有看到任何会自动将其转换为响应标头的代码。

答案 2 :(得分:-1)

这看起来像一个Roxy应用程序,不确定是否使用ML Rest扩展。 我会向Roxy网站发帖提问......

http://developer.marklogic.com/code/roxy

或者MarkLogic通用邮件列表。

MarkLogic开发人员讨论

Roxy是开发人员产品,而非官方MarkLogic产品。

如果写一个纯粹的&#34; HTTP应用程序然后您的技术将工作。我不知道你需要什么Roxy的其他功能,你可以使这个特定的端点成为纯HTTP端点而不改变其余的吗?