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的参考实现
有关获取文件扩展名的替代方法,请参见