我在将PostgreSQL数据库中存储为base64的图像转换为要在网站上显示的图像时遇到问题。数据类型是byta,我需要通过cURL获取数据。
我正在使用API连接到返回XML数据的客户的股票系统。
我知道在数据库中以这种方式存储图像不是一个好主意,但这就是客户端系统的工作方式,它不能更改,因为它是第三方提供的企业解决方案的一部分。
我使用以下内容从PICTURE表中查询数据库中的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()函数来转换查询中的数据吗?然而,我尝试了很多组合,但我被卡住了。我对一些问题投了反对票,我不太确定为什么,所以如果这是一个糟糕的问题,我很抱歉,我真的需要一些帮助。
(注:为了安全起见,我已经用xxxxx替换了IP和$服务器)
进一步解释:客户端有一个基于ASP.NET的POS系统,并将数据保存为远程服务器上的XML文件。我可以通过API访问这些数据,其中包括使用HTTP/cURL的SQL查询函数,定义如下:
http://remoteserver:82/pos.asmx.GetSql?datasource=DATASOURCE&query=MYQUERY
因此,为了获得包含图片数据的字段,我目前正在使用上面的代码。
查询在CURL URL中,即http://remoteserver:82/pos.asmx.GetSql?datasource=12345&query=SELECT+*+FROM+picture+WHERE+part+=+'01000015'";
然而,这会返回System.Byte[]
,而不是我可以在PHP中解码的编码数据。
其他信息:PostgreSQL版本:PostgreSQL 9.1.3在i686 pc linux gnu上,由gcc(gcc)4.1.2 20080704(Red Hat 4.1.2-51)编译,32位
表架构:此处提供:https://i.stack.imgur.com/sc8Gw.png
您最好让服务器将数据作为bytea
字段存储在PostgreSQL中,然后编码到base64发送到客户端,但听起来您无法控制服务器。
字符串System.Byte[]
表明它是一个使用.NET的应用程序,类似于ASP.NET或类似程序,并且它没有正确处理字节数组。它没有将其格式化为base64以用于输出,而是将类型名称嵌入到输出中。
您无法在客户端解决此问题,因为服务器发送了错误的数据。
您需要显示服务器端的表和查询。
修改查询后更新:
您正在存储一个bytea
并直接返回它。客户端似乎不理解字节数组,并试图天真地输出它,可能有点像将其转换为字符串。由于文档中说它需要"base64",所以您可能应该提供它,而不是字节数组。
PostgreSQL有一个方便的函数来对字节数据进行base64编码:encode
。
尝试:
SELECT
account, company, date_amended,
depot, keyfield, part,
encode(picture, 'base64') AS picture,
picture_size, source
FROM picture
WHERE part = '01000015'
格式化并不重要,它只是让这里更容易阅读