如何为下载的csv设置文件名导致其余的扩展?

时间:2014-08-19 18:12:57

标签: marklogic

我有一个休息扩展,提出了一个产生文档的计算请求.GET会将文档的文本元素下载为csv。

更新:在代码中查看评论 更新2: 更新的代码包括抛出错误的行 POST将存储一个包含文件名的文档 strlf:get-file-name($ id)函数返回文件名(测试并自行工作)

更新3见下面的工作示例!

declare 
%roxy:params("ID=xs:number")
function strlf:get(
  $context as map:map,
  $params  as map:map
) as document-node()*
{

    (: this does not work and gives ERROR
    let $id := map:get($params,"ID")
    let $filename := strlf:get-file-name($id)
    :)
    map:put($context, "output-types", "application/csv"),
    xdmp:add-response-header("Content-Disposition", 'attachment; filename="lijst.csv"'),
    xdmp:set-response-code(300, "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/vertaler/"),$query)), ('filtered'))

                    return $doc/jbasic:json/jbasic:Text/text()


              }
              catch ($e) {
                element error { $e/error:message }
              }
    }
};  

现在我的问题:如何在每次调用API时更改附件的默认文件名“lijst.csv”以获得自定义文件名(包括csv中行数的计数,例如“ lijst-123.csv“如果有123行)?

实际上文件名已存在于文档中,似乎我无法动态地在标题中设置它?

部署扩展时

错误:

ERROR: 400 "Bad Request"
ERROR: <rapi:error xmlns:rapi="http://marklogic.com/rest-api"><rapi:status-code>400</rapi:status-code><rapi:status>Bad Request</rapi:status><rapi:message-code>RESTAPI-INVALIDCONTENT</rapi:message-code><rapi:message>RESTAPI-INVALIDCONTENT: (err:FOER0000) Invalid content: invalid vertaler extension: could not parse XQuery extension vertaler; please see the server error log for detail XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected QName_; vertaler either is not a valid module or does not provide extension functions (delete, get, put, post) in the http://marklogic.com/rest-api/resource/vertaler namespace</rapi:message></rapi:error>

工作解决方案:

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"),

    let $id := map:get($params,"ID")
    let $fn := strlf:get-file-name($id)
    return xdmp:add-response-header("Content-Disposition", fn:concat('attachment; filename="',$fn,'"')),
    xdmp:set-response-code(300, "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/vertaler/"),$query)), ('filtered'))

                    return $doc/jbasic:json/jbasic:Text/text()


              }
              catch ($e) {
                element error { $e/error:message }
              }
    }
}; 

1 个答案:

答案 0 :(得分:1)

你的意思是:

let $count := xdmp:estimate(cts:search(...))
return
    xdmp:add-response-header("Content-Disposition", fn:concat('attachment; filename="list', $count, '.csv"'))

更新

您尝试似乎缺少需要遵循let语句的return语句。请注意,逗号分隔函数中的语句。我建议将let一行向下移动(到第一个map下面:put),然后在它们之后添加'return',大致如下:

map:put($context, "output-types", "application/csv"),

let $id := map:get($params,"ID")
let $filename := strlf:get-file-name($id)
return
    xdmp:add-response-header("Content-Disposition", 'attachment; filename="lijst.csv"'),

...

HTH!

相关问题