直接在eXide(Eval)中运行以下xquery效果很好,将MyFS目录中的XML文件添加到MyCollectionPath中:
xquery version "3.1";
let $selected_directory:= 'MyFSdirectory'
let $source-directory := $selected_directory
let $target-collection := 'MyCollectionPath'
return
xmldb:store-files-from-pattern($target-collection, $source-directory, '*.xml')
但是,当我将其添加到函数中并从我的应用中调用它时,store-files-from-pattern无法完成工作(未显示错误,但文件未上传),检查点打印在我的屏幕,因此该函数被正确调用。有提示吗?
declare function app:upload_file($node as node(), $model as map(*)) {
let $selected_directory:= "MyFSdirectory"
let $source-directory := $selected_directory
let $target-collection := "MyCollectionPath"
return
<p>check point</p> |
xmldb:store-files-from-pattern($target-collection, $source-directory, '*.xml')
};
答案 0 :(得分:2)
这听起来像是权限问题。换句话说,当您在eXide中运行脚本时,您可能以对目标集合具有写权限的用户(例如“ admin”)身份运行,但是在您的应用程序中,该脚本很可能以来宾用户身份运行,而没有必须具有写入目标集合的权限。
要进行故障排除,请在您的app:upload_file()
函数中添加一个调用xmldb:login()
的表达式,为您在eXide中使用的用户提供凭据。
如果以此方式提升特权有效,那么下一步将是考虑在目标集合上设置适当的权限,或者考虑在写入数据库的模块上应用setuid or setgid。