2014-10-06 64 views
1

我有一个问题,存储为base64 PostgreSQL数据库中的图像转换成图像,显示在网站上。数据类型是bytea,我需要通过cURL获取数据。PostgreSQL的Base64编码图像进行解码的问题

我与API合作,以连接到客户端的股票系统返回的XML数据。

我知道存储图像这样的DB是不是一个好主意,但是这是客户端的系统是如何工作的,它不能被改变,因为它是由第三方提供的企业解决方案的一部分。

我用下面从图像表查询数据库的PICTURE字段,其中PART = 01000015

$ch = curl_init(); 

$server = 'xxxxxx'; 

     $select = 'PICTURE'; 
     $from = 'picture'; 
     $where = 'part'; 
     $answer = '01000015'; 

     $myquery = "SELECT+".$select."+FROM+".$from.'+WHERE+'.$where."+=+'".$answer."'"; 


//Define curl options in an array 
$options = array(CURLOPT_URL => "http://xx.xxx.xx.xx/GetSql?datasource=$server&query=$myquery+limit+1", 
    CURLOPT_PORT => "82", 
    CURLOPT_HEADER => "Content-Type:application/xml", 
    CURLOPT_RETURNTRANSFER => TRUE 
); 

//Set options against curl object 
curl_setopt_array($ch, $options); 

//Assign execution of curl object to a variable 
$data = curl_exec($ch); 

//Close curl object 
curl_close($ch); 

//Pass results to the SimpleXMLElement function 
$xml = new SimpleXMLElement($data); 

//Return String 
echo $xml->row->picture; 

我从这个得到的回应是:System.Byte[]

因此,如果我在PHP中使用base64_decode()我显然只是解码字符串“System.Byte []”。

我猜测我需要使用PostgreSQL中DECODE()函数来转换数据的查询?不过,我尝试了大量的组合,但我卡住了。我有一些问题的提示,我不太确定为什么如果这是一个糟糕的问题,我很抱歉,我真的需要这个帮助。

(注:我已经更换了IP和$服务器XXXXX安全)

为了进一步解释: 客户端具有基于ASP.NET POS系统和保存数据远程服务器上的XML文件。我有机会获得这些数据通过一个API,其中包括一个SQL查询功能使用定义HTTP /卷曲如下:

http://remoteserver:82/pos.asmx.GetSql?datasource=DATASOURCE&query=MYQUERY

因此,要获得一个包含我目前usingthe以上代码的图片数据的字段。

该查询是在CURL URL即http://remoteserver:82/pos.asmx.GetSql?datasource=12345&query=SELECT+*+FROM+picture+WHERE+part+=+'01000015'";

然而,这将返回System.Byte[]代替编码数据,我可以然后在PHP解码。

附加信息: PostgreSQL的版本:9.1.3的PostgreSQL在i686-Linux PC的GNU的,由GCC编译(GCC)4.1.2 20080704(红帽4.1.2-51),32位

表模式: 可在这里:http://i.stack.imgur.com/sc8Gw.png

+0

读取当人们downvote他们应该解释为什么。不幸的是,他们并不总是。在这种情况下,它有点困惑,但这就是为什么你要问一个问题。我在这里主要关心的是,没有迹象表明PostgreSQL进入图片的位置;如果这是“客户端系统如何工作”和“无法更改”,那么您如何才能更改查询?如果您确实有能力更改查询,那么您应该显示表格模式和您询问的查询**。 (你的PostgreSQL版本也应该包括在内)。 – 2014-10-07 03:23:51

+0

谢谢,我添加了更多信息。我希望这使事情更清楚? – freakyfirefly 2014-10-07 09:08:10

+0

是的,这有帮助。我永远不会想象一个足以让你在HTTP GET URL上提供任意SQL查询的疯狂设计。呃,'DROP TABLE客户;'很多?无论如何,你还需要显示'picture'表的模式;在'psql'中尝试'\ d图片'。 – 2014-10-07 09:24:30

回答

0

你最好具有服务器存储PostgreSQL中的数据为bytea字段,然后编码为Base64发送到客户端,但它听起来像是你不控制的服务器。

字符串System.Byte[]表明它是一个使用.NET的应用程序,如ASP.NET或类似的应用程序,它不正确地处理bytea数组。不是将其格式化为base64来输出,而是将类型名称嵌入到输出中。

你不能修复在客户端上,因为服务器发送了错误的数据。

你需要显示服务器端表和查询。


更新查询修改后:

你存储bytea,并直接返回它。客户端似乎并不理解字节数组,并试图天真地输出它,可能像将其转换为字符串。由于文档说它期望“base64”,你可能应该提供那个,而不是一个字节数组。

PostgreSQL有一个方便的功能来base64编码bytea数据:encode

尝试:

SELECT 
    account, company, date_amended, 
    depot, keyfield, part, 
    encode(picture, 'base64') AS picture, 
    picture_size, source 
FROM picture 
WHERE part = '01000015' 

的格式化并不显著,它只是更容易在这里

+0

不幸的是,我无法访问来自CURL URL的服务器端查询。你在说什么似乎到底发生了什么。图像以base64格式存储在'bytea'字段中,但我需要能够使用正确格式的SELECT来拉取图像。 我知道它可以做到,但我不确定PostgreSQL的语法 – freakyfirefly 2014-10-07 09:09:33

+0

@freakyfirefly查看更新 – 2014-10-07 10:56:34

+0

谢谢!现在返回数据!奇怪的是,这是一张猫的图片......这不应该......被这个......迷茫但令人困惑的混乱...... – freakyfirefly 2014-10-07 11:56:00