2014-10-06 63 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