使用XQL / exists-db

时间:2017-11-08 14:47:15

标签: xml xquery exist-db

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&amp;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作为路径,相信控制器可以做它做的事情?为什么我必须使用相对路径来解决问题?

哎呀!

2 个答案:

答案 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。

话虽这么说,你并不是唯一一个经常被模板系统愚弄的人,他们对目前的情况有所了解:)