2010-04-13 135 views
2

我似乎無法找出將二進制數據從SQL Server讀取到PHP的方法。我正在開發一個項目,我需要能夠將圖像直接存儲在SQL表中,而不是在文件系統上。幫助將二進制圖像數據從SQL Server讀取到PHP中

目前,我一直在使用類似的查詢這一個:

INSERT INTO mytable的(文件) SELECT * FROM OPENROWSET(BULK N'C:\ image.jpg的」,SINGLE_BLOB)作爲BLAH

這工作正常,實際上插入圖像到表中,但我還沒有想出一種方法來檢索它,並讓我的圖像回來。

我正在用PHP做這件事,最終將不得不使用存儲過程,但任何人都可以啓發我獲取二進制數據(varbinary(MAX))並生成圖片。

我期望它很容易使用SELECT語句,並添加一個內容類型到標題,表明它是一個圖像,但它根本無法正常工作。相反,該頁面將顯示文件的名稱,這是我在過去遇到的,並將其理解爲與圖像數據有關的錯誤。

編輯:我想我想通了。 SQL Server在從存儲過程讀取時僅發送最多8000字節時出現了一些問題,因此導致我測試的圖像中斷。

 
$q = "Get_Picture_Test_SP @pk_rms_id=1443546"; 
$res = mssql_query($q); 

$row = mssql_fetch_assoc($res); 

$image = $row['picture']; 

function hex2bin($h) 
    { 
    if (!is_string($h)) return null; 
    $r=''; 
    for ($a=0; $a<strlen($h); $a+=2) { $r.=chr(hexdec($h{$a}.$h{($a+1)})); } 
    return $r; 
    } 

$image = hex2bin($image); 

header("Content-type: image/gif"); 

print $image; 

exit; 
?> 

這是我如何顯示圖像。謝謝你提到這個十六進制提示,這讓我能夠弄清楚什麼是錯誤的。

+0

您是否嘗試過使用chrome查看無效圖像的來源?可能存在PHP錯誤,導致圖像無效,或者可能解釋爲什麼甚至沒有圖像數據被丟棄。我記得曾經有一種方法可以在Firefox中做到這一點,但現在唯一一款爲我工作的瀏覽器是Chrome。 – Dereleased 2010-04-13 15:21:02

+0

我曾嘗試使用SQL Server Management Studio並將二進制數據直接保存到我的文件系統,甚至不會顯示圖像。當我查看錶格時,數據以「0xFFD8FFE0 ...」格式存儲,而不是一堆垃圾字符。 – 2010-04-13 15:25:57

+0

我可以訪問兩臺服務器。其中之一我有非常低的權限設置,不允許我使用批量插入,並且它使我很難測試出我遇到的圖像問題。另一個是我最近特意試圖找出顯示圖像的方法,並且我目前安裝了SQL服務器,並且Apache使用PHP工作。我還沒有能夠配置我的php.ini文件來與SQL Server一起工作,但是在這個測試服務器上我得到了。只要我得到SQL服務器與PHP工作,我可以做更多的測試。 – 2010-04-13 15:28:50

回答

2

沒有使用SQLServer的經驗,但我曾在MySQL中使用過BLOB。你有兩個選擇,

  1. 轉義二進制數據,所以它在SQL查詢工作。你可以通過在數據插入前使用addslashes()和在返回時使用stripslashes()來完成。

  2. 使用十六進制SQL查詢語法。

不知道它是標準的SQL,但在MySQL中,你可以閱讀到BLOB這樣的十六進制,

select hex(image) from table; 

您可以在SQL編寫的二進制數據爲十六進制像X'1234ABCD」。

PHP提供了hex2bin/bin2hex,因此您可以輕鬆轉換。

+0

哦,所以當我拉入數據時,找到一個PHP函數將十六進制轉換爲二進制,然後嘗試顯示圖像?我想也許它已經在十六進制形式,這可能是它不工作的原因。在完成讓SQL Server完成我的Apache PHP設置後,我會嘗試類似的方式。 – 2010-04-13 17:27:53

+0

查看我的編輯。如果它已經是十六進制形式,則只需使用hex2bin()將其轉換爲二進制。 – 2010-04-13 18:11:50

+0

非常感謝。這徹底解決了我的問題。 – 2010-04-13 18:40:30

相關問題