APP结构
NiC
| upload.xq
| upload.html
| controller.xql
| assignments.html (a lot of files are in the main dir, which is probably not good)
| templates/page.html
| inReview/
| data/all the xml files currently in the database
| images/all the images currently in the db
| modules/app.xql
| modules/view.xql
并非所有文件都在这里,而只是一些相关的文件。
目前的新发现和问题
我一直试图让这个上传者工作,而且我在每一个转折点都受到了阻碍 - 但是,我认为它终于有效了。然而,它以一种非常奇怪的方式工作,我不知道为什么。不知道为什么它以这种方式工作而不是另一种方式让我发疯,这将导致其他问题。所以,我希望有人可以解决一些问题!
我基本上将eXist-db中样本莎士比亚档案中的新内容整合在一起。因此,我的整个应用程序的结构几乎与ship-with演示相同。有人说过:
page.html中的,它模拟了网页的整体外观并提供了标题/导航信息:
我添加了导航到上传页面的链接:
<li><a href="../upload.html">Contribute</a></li>
upload.html:
<div xmlns="http://www.w3.org/1999/xhtml" class="templates:surround?with=templates/page.html&at=main">
<form enctype="multipart/form-data" method="post" action="upload.xql">
<fieldset>
<legend>Upload an XML File for Review:</legend>
<input type="file" name="file"/>
<button id="f-btn-upload" name="f-btn-upload" value="true" type="submit" class="btn btn-danger">Upload</button>
</fieldset>
</form>
</div>
upload.xql:
xquery version "3.0";
let $collection := '/db/apps/NiC/inReview/'
let $filename := request:get-uploaded-file-name('file')
(: make sure you use the right user permissions that has write access to this collection :)
let $login := xmldb:login($collection, 'username', 'superstrongpassword')
let $store := xmldb:store($collection, $filename, request:get-uploaded-file-data('file'))
return
<results>
<message>File {$filename} has been stored at collection={$collection}.</message>
</results>
以某种方式所有这些都有效。但奇怪的是在controller.xql中:
以下是相关位:
else if ($exist:resource = ("search.html", "form1.html", "demo-queries.html", "search-help.html", "about-NiC.html", "assignments.html", "success.html", "upload.html")) then
(: the html page is run through view.xql to expand templates :)
(: question: 11/2017 why if upload.html is noted here does the URL need to be relative to ../upload.html from page.html, though others don't? :)
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<forward url="{$exist:controller}/{$exist:resource}">
<set-header name="Cache-Control" value="no-cache"/>
</forward>
<view>
<forward url="{$exist:controller}/modules/view.xql"/>
</view>
<error-handler>
<forward url="{$exist:controller}/error-page.html" method="get"/>
<forward url="{$exist:controller}/modules/view.xql"/>
</error-handler>
</dispatch>
如果在page.html中,我只使用链接&#34; upload.html&#34;因为控制器似乎需要(upload.html在同一个地方,并且做其他页面的一般事情,如assignments.html等),它不起作用。我在prolog中得不到SAX异常错误/内容。其他页面可访问,URL解析按预期工作。但如果链接是&#34; ../ upload.html,&#34;该页面是可访问的,上传按我的意愿工作。
所以我的问题是:为什么?为什么我不能仅使用upload.html作为路径,相信控制器可以做它做的事情?为什么我必须使用相对路径来解决问题?
哎呀!
答案 0 :(得分:0)
request:get-uploaded-file-data()
的返回类型是xs:base64Binary*
而xmldb:store()
期望&#34;节点,xs:字符串,Java文件对象或xs:anyURI&#34; (来自功能文档)。
所以你必须首先通过util:binary-to-string()
管道结果,如
xmldb:store($collection, $filename, util:binary-to-string(request:get-uploaded-file-data('file')))
您看到的错误是因为xmldb:store()
如果失败则抛出XPathException。
答案 1 :(得分:0)
那么只是为了澄清您的应用结构是什么?
yourapp
| modules/upload.xq
| templates/page.html
| upload.html
| other1.html
| controller.xql
你的other1.html文件也调用.xq模块吗?控制器以不同的方式处理.html和.xq文件,因此要从modules / upload.xq开始,您需要使用相对路径步骤../
来访问upload.html。
话虽这么说,你并不是唯一一个经常被模板系统愚弄的人,他们对目前的情况有所了解:)