Xquery 它们是否等效于文件:序列化二进制文件以在exist db中存储数据

Xquery 它们是否等效于文件:序列化二进制文件以在exist db中存储数据,xquery,exist-db,Xquery,Exist Db,我有一个web服务运行在与exist db相同的机器上,它使用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

我有一个web服务运行在与exist db相同的机器上,它使用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')
xquery版本“3.0”;
让$testdata:=util:binary文档('/db/data/Customers/assets/logo.pdf'))
让$url:=”http://localhost:4802/Pdf2Img.aspx" 
让$headers:=
让$b64response:=httpclient:post(xs:anyURI($url),$testdata,false(),$headers)/httpclient:body/text()
返回
文件:序列化二进制($b64response,'D:\DataLoad\test.png')
这个很好用。它将PNG图像存储在文件系统中没有问题

我在整个文档中寻找的基本上都是相同的示例,但允许我将解码的$B64响应作为二进制图像直接存储到数据库中。我找不到任何函数将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

Ivborw0kggoaaansuheugabfia。。。。在这里剪断
就这些了,我只想获取httpclient:body/text()并将其存储为它在数据库中表示的PNG

我错过了什么


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

请参阅我在的注释示例代码,它使用HTTP响应主体的媒体类型信息作为
xmldb:store()
函数的第四个参数,以成功地将二进制文件存储在数据库中。如果您能将代码指向代码无法处理的图像URL,我很乐意更新代码以使其正常工作。

答案是将响应转换为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')
xquery版本“3.0”;
让$testdata:=util:binary文档('/db/data/Customers/assets/eidologo.pdf'))
让$url:=”http://localhost:4802/Pdf2Img.aspx" 
让$headers:=
让$b64response:=httpclient:post(xs:anyURI($url),$testdata,false(),$headers)
返回
xmldb:store('/db/data/Customers/assets','test.png',xs:base64Binary($b64response),'image/png')

我尝试了您在响应中所做的操作(基本上是util:binary-to-string()),当它保存到数据库时,文件已损坏。在阅读您的代码时,我认为它没有回答我的问题。内容以二进制(见上文)type=“binary”和encoding=“Base64Encoded”返回。因此,您的代码将获取base64的字符串并将其存储在数据库中,这正是我尝试存储响应时得到的结果。如果我使用编辑器检查数据库中的文件,我会看到base64编码的数据,而不是二进制数。您注释中的关键是响应不是图像,而是base64编码的图像。请参见上文In如果您希望进行评估,请向我指出一个可公开访问的base64编码图像/文件的URL,我(以及其他人,如果他们先找到的话)可以使用该URL复制您的结果并测试解决方案?