簡體   English   中英

PostgreSQL Base64圖像解碼問題

[英]PostgreSQL Base64 Image decode issue

我在將以base64存儲在PostgreSQL數據庫中的圖像轉換為圖像以顯示在網站上時遇到問題。 數據類型為bytea,我需要通過cURL獲取數據。

我正在使用API​​連接到返回XML數據的客戶股票系統。

我知道以這種方式將圖像存儲在數據庫中並不是一個好主意,但這是客戶系統的工作方式,並且它不能更改,因為它是第三方提供的企業解決方案的一部分。

我正在使用以下內容來查詢數據庫,從PICTURE表中的PART部分= 01000015的PICTURE字段

$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和$ server)

進一步說明:客戶端具有一個基於ASP.NET的POS系統,並將數據作為XML文件保存在遠程服務器上。 我可以通過API訪問此數據,該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版本: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

您最好讓服務器將數據存儲在PostgreSQL中作為bytea字段,然后編碼為base64以發送給客戶端,但這聽起來像是您無法控制服務器。

字符串System.Byte[]表示它是一個使用.NET的應用程序,例如ASP.NET或類似的應用程序,並且未正確處理bytea數組。 而不是將其格式化為base64進行輸出,而是在輸出中嵌入類型名稱。

您無法在客戶端上解決此問題,因為服務器發送了錯誤的數據。

您需要顯示服務器端表和查詢。


查詢修改后更新

您正在存儲一個bytea ,並直接將其退回。 客戶端似乎不了解字節數組,並試圖天真地將其輸出,可能類似於將其轉換為字符串。 因為文檔說它期望“ base64”,所以您應該提供它,而不是字節數組。

PostgreSQL有一個方便的功能,可以對teatea數據encode base64編碼: encode

嘗試:

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

格式並不重要,只是使此處更易於閱讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM