它们等同于file:serialize-binary以在exists-db中存储数据

时间:2017-07-26 21:09:41

标签: xquery exist-db

我有一个与exists-db在同一台机器上运行的Web服务,它使用PDF(从数据库作为base64)并使用httpclient返回PNG(作为base64)。

Xquery的一个简单示例是:

xquery version "3.0";
let $testdata := util:binary-doc('/db/data/Customers/assets/logo.pdf')
let $url := "http://localhost:4802/Pdf2Img.aspx" 
let $headers := <headers></headers>
let $b64response := httpclient:post(xs:anyURI($url),$testdata,false(),$headers)/httpclient:body/text()
return
file:serialize-binary($b64response,'D:\DataLoad\test.png')

这很好用。它将PNG图像存储在文件系统中没有问题。

我在整个文档中寻找的内容基本上是相同的例子,但允许我将解码后的$ b64response作为二进制图像直接存储到数据库中。我找不到任何函数将base64解码为二进制文件,然后将数据存储在数据库中。

现在,我知道我可以将写入磁盘的这个文件注入数据库,但我试图避免这会导致问题(如清理,多线程和命名)。

如果你想知道,答案是这样的:

<httpclient:response xmlns:httpclient="http://exist-db.org/xquery/httpclient" statusCode="200">
  <httpclient:headers>
    <httpclient:header name="Cache-Control" value="private"/>
    <httpclient:header name="Transfer-Encoding" value="chunked"/>
    <httpclient:header name="Content-Type" value="image/png"/>
    <httpclient:header name="Server" value="Microsoft-IIS/10.0"/>
    <httpclient:header name="X-AspNet-Version" value="4.0.30319"/>
    <httpclient:header name="X-Powered-By" value="ASP.NET"/>
    <httpclient:header name="Date" value="Wed, 26 Jul 2017 21:07:26 GMT"/>
  </httpclient:headers>
<httpclient:body mimetype="image/png" type="binary" encoding="Base64Encoded">iVBORw0KGgoAAAANSUhEUgAABfIA .... snipped here

所以它就在那里,我只想采用httpclient:body / text()并将其存储为它在数据库中表示的PNG。

我在这里缺少什么?

更新我用工作解决方案回答了我自己的问题。

2 个答案:

答案 0 :(得分:2)

请参阅我在https://gist.github.com/joewiz/5938909注释的示例代码,它使用HTTP响应正文的媒体类型信息作为xmldb:store()函数的第4个参数,以便将二进制文件成功存储在数据库中。如果您可以将我指向代码无法处理的图像URL,我很乐意更新代码。

答案 1 :(得分:0)

答案是将响应转换为xs:base64Binary。以下作品:

xquery version "3.0";
let $testdata := util:binary-doc('/db/data/Customers/assets/eidologo.pdf')
let $url := "http://localhost:4802/Pdf2Img.aspx" 
let $headers := <headers><header name="override-media-type" value="application/octet-stream"/></headers>
let $b64response := httpclient:post(xs:anyURI($url),$testdata,false(),$headers)
return
xmldb:store('/db/data/Customers/assets','test.png', xs:base64Binary($b64response), 'image/png')