PostgreSQL Base64图像解码问题

时间:2014-10-06 20:04:09

标签: php xml postgresql curl

我在将PostgreSQL数据库中存储为base64的图像转换为要在网站上显示的图像时遇到问题。数据类型是bytea,我需要通过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()函数来转换查询中的数据?但是,我尝试了很多组合但是我被卡住了。我有一些问题的暗示,我不太清楚为什么如果这是一个糟糕的问题,我很抱歉,我真的需要一些帮助。

(nb:为了安全起见,我用xxxxx替换了IP和$服务器)

进一步解释: 客户端具有基于ASP.NET的POS系统,并将数据作为XML文件保存在远程服务器上。我可以通过API访问此数据,该API包含使用HTTP / cURL定义的SQL查询函数,如下所示:

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

所以要获取包含我目前使用上述代码的图片数据的字段。

查询位于CURL网址中,即http://remoteserver:82/pos.asmx.GetSql?datasource=12345&query=SELECT+*+FROM+picture+WHERE+part+=+'01000015'";

然而,这会返回System.Byte[]而不是编码数据,然后我可以在PHP中解码。

其他信息: PostgreSQL版本:i686-pc-linux-gnu上的PostgreSQL 9.1.3,由gcc(GCC)4.1.2 20080704(Red Hat 4.1.2-51)编译,32位

表格架构: 可在此处获取:http://i.stack.imgur.com/sc8Gw.png

1 个答案:

答案 0 :(得分:0)

您最好让服务器将PostgreSQL中的数据存储为bytea字段,然后编码为base64以发送给客户端,但听起来您不能控制服务器。

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

您无法在客户端修复此问题,因为服务器正在发送错误的数据。

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


查询修改后

更新

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

PostgreSQL有一个方便的功能,可以对bytea数据进行base64编码:encode

尝试:

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

格式化并不重要,只是让它更容易阅读