Html Xquery多文件上传

Html Xquery多文件上传,html,xquery,marklogic,Html,Xquery,Marklogic,我的单个文件上载如下所示: declare function local:uploadFile() { let $file := xdmp:get-request-field("upload") let $filename := xdmp:get-request-field-filename("upload") let $contenttype := xdmp:get-request-field-content-type("upload") let $extension := fn:repla

我的单个文件上载如下所示:

declare function local:uploadFile()
{

let $file := xdmp:get-request-field("upload")
let $filename := xdmp:get-request-field-filename("upload")
let $contenttype := xdmp:get-request-field-content-type("upload")
let $extension := fn:replace($filename, '.*\.', '')
let $insert := switch ($contenttype)
    case "text/xml"
    case "text/xhtml"
    case "text/csv"
    case "text/plain"
    case "application/json"
        return xdmp:document-insert($filename,xdmp:unquote($file))
    case "application/octet-stream"
        return switch ($extension)
        case "gpx"
            return xdmp:document-insert($filename,xdmp:unquote(xdmp:quote(binary{xs:hexBinary($file)})))
        default
            return xdmp:document-insert($filename,$file)
    default
        return xdmp:document-insert($filename,$file)
return fn:concat("file '",$filename,"' uploaded, contenttype: ",$contenttype," extension: ",$extension)
};
<form name="test" action="upload.xqy" method="post" enctype="multipart/form-data">
    <p><label>File to upload:
    <input type="file" class="name" name="upload" size="50" multiple="true" /></label></p>
    <p><input type="submit" value="Upload and Get Results"/></p>
    </form>
现在我想把它改成支持多个文件。 它使用的html表单通过添加
multiple=“true”
属性,支持上传多个文件

看起来是这样的:

declare function local:uploadFile()
{

let $file := xdmp:get-request-field("upload")
let $filename := xdmp:get-request-field-filename("upload")
let $contenttype := xdmp:get-request-field-content-type("upload")
let $extension := fn:replace($filename, '.*\.', '')
let $insert := switch ($contenttype)
    case "text/xml"
    case "text/xhtml"
    case "text/csv"
    case "text/plain"
    case "application/json"
        return xdmp:document-insert($filename,xdmp:unquote($file))
    case "application/octet-stream"
        return switch ($extension)
        case "gpx"
            return xdmp:document-insert($filename,xdmp:unquote(xdmp:quote(binary{xs:hexBinary($file)})))
        default
            return xdmp:document-insert($filename,$file)
    default
        return xdmp:document-insert($filename,$file)
return fn:concat("file '",$filename,"' uploaded, contenttype: ",$contenttype," extension: ",$extension)
};
<form name="test" action="upload.xqy" method="post" enctype="multipart/form-data">
    <p><label>File to upload:
    <input type="file" class="name" name="upload" size="50" multiple="true" /></label></p>
    <p><input type="submit" value="Upload and Get Results"/></p>
    </form>

要上载的文件:

问题是,如果我尝试上载多个文件,
getrequest字段(
)语句会返回多个参数。我试着使用
fn:tokenize()
,但这不起作用。我是否可以使用类似for循环的东西,或者是否有一个函数来分解它们


提前谢谢你

根据文档,xdmp:get-request-field()函数签名声明它返回项*-因此,可以预期它返回一系列项,可以通过
xdmp:get-request-field()[1]
xdmp:get-request-field()[2]
等方式访问。。等等

<>您可能会考虑在FLWOR语句中用请求文件名(同样的签名和相同的顺序)平衡相同的请求字段(

)来做到这一点。
为什么你会认为它是一个标量?xQuery方便地将一个项目序列和一个标量视为同一事物。

根据文档,xdmp:get-request-field()函数签名声明它返回项目*-因此,可以预期它返回一个项目序列,并且可以通过
xdmp:get-request-field()[1]
访问,
xdmp:get-request-field()[2]
等。。等等

<>您可能会考虑在FLWOR语句中用请求文件名(同样的签名和相同的顺序)平衡相同的请求字段(

)来做到这一点。
为什么你会认为它是一个标量?xQuery方便地将一个项目的序列和一个标量视为同一事物。

对于xQuery新手来说,在一组返回匹配序列的函数之间执行循环可能很棘手。有很多方法可以做到这一点。这里有一个简单的例子:

  for $file at $pos in xdmp:get-request-field("upload")
    let $filename := xdmp:get-request-field-filename("upload")[$pos],
      $contenttype := xdmp:get-request-field-content-type("upload")[$pos],
      $extension := fn:replace($filename, '.*\.', ''),
      $insert := switch ($contenttype)
   ... 
注意使用$pos仅从第一个序列中提取位置,然后使用它从每个其他请求中提取正确的项目

注意:使用备用let样式(个人偏好,我不希望看到let的每一行重复)

您可以通过其他方式来实现这一点,例如,请参阅中每对的fn:for的参考实现


有关获取文件扩展名的替代方法,请参见对xquery新手来说,在返回匹配序列的一组函数上执行循环可能很棘手。有很多方法可以做到这一点。这里有一个简单的例子:

  for $file at $pos in xdmp:get-request-field("upload")
    let $filename := xdmp:get-request-field-filename("upload")[$pos],
      $contenttype := xdmp:get-request-field-content-type("upload")[$pos],
      $extension := fn:replace($filename, '.*\.', ''),
      $insert := switch ($contenttype)
   ... 
注意使用$pos仅从第一个序列中提取位置,然后使用它从每个其他请求中提取正确的项目

注意:使用备用let样式(个人偏好,我不希望看到let的每一行重复)

您可以通过其他方式来实现这一点,例如,请参阅中每对的fn:for的参考实现

有关获取文件扩展名的替代方法,请参见