Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Marklogic 如何在rest扩展中为下载的csv结果设置文件名?_Marklogic - Fatal编程技术网

Marklogic 如何在rest扩展中为下载的csv结果设置文件名?

Marklogic 如何在rest扩展中为下载的csv结果设置文件名?,marklogic,Marklogic,我有一个rest扩展,它将请求生成一个文档的计算结果。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:ma

我有一个rest扩展,它将请求生成一个文档的计算结果。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 }
              }
    }
};  
现在我的问题是:如何更改附件的默认文件名“lijst.csv”,使其在每次调用API时都具有自定义文件名(包括csv中的行数计数,例如,如果有123行,则为“lijst-123.csv”)

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

部署扩展时出错:

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>

你是说:

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

...

可能的重复项类似但不重复,我的问题是我无法在xdmp:add响应头之前添加代码,一旦我添加了任何无法删除的代码,请在添加“let$count:=…”后立即更新。我无法部署扩展…请提供给出所述错误的准确行。它报告一个语法错误。特别注意单引号和双引号。这很容易搞砸。如果你填上这些点,我上面提供的几行应该行得通..谢谢你,先生!
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"'),

...