2014-02-06 100 views
1

所以,我有這個firebird數據庫,有一個「照片」列,我試圖顯示。使用PHP顯示來自Firebird數據庫的blob數據

這裏是我到目前爲止已經完成:

  • 因爲,內容類型未知(我不是誰創建的數據庫的一個,並沒有colomn指示型)。
  • 從blob數據的前20個字符我猜這是一個bmp。

下面是一個示例代碼:

Before this : code to connect, run a query to get the table and fetch the result as object (everything works fine until here) 

$blob_data = ibase_blob_info($row->PHOTO); 
$blob_hndl = ibase_blob_open($row->PHOTO); 

$bl = ibase_blob_get($blob_hndl, $blob_data[0]); 
header('Content-type : image/x-xbitmap'); 
ibase_blob_echo($row->PHOTO); 

echo "<dt><strong>Technician Image:</strong></dt><dd>" . 
    '<img src="data:image/x-xbitmap ;base64,'. 
    base64_encode($bl). 
     '" width="290" height="290">' . "</dd>"; 

$filename = $bl ? dirname(__FILE__)."/img/product__$NUM.bmp" : dirname(__FILE__)."/img/no_pic.bmp"; 

if ($bl) fwrite(fopen($filename, 'w'), $bl); 

正如你可以看到我已經試過:

  • 顯示使用blob數據 「ibase_blob_echo」
  • 顯示使用IMG團塊標籤
  • 另存爲文件

第一個顯示blob的原始數據,第二個沒有,第三個結果在損壞的文件中。

關於Content-type頭我已經試過

  • 圖像/ BMP,X-便攜位圖,X-xbitmap,JPG,GIF,PNG

現在我出來的想法...

+0

發佈前20個字節的十六進制。 –

+0

「01 00 00 01 36 65 01 00 42 4D 36 65 01 00 00 00」 「42 4D」在我得到的每張照片中。 – Med

回答

0

作爲bitmap在位置0有0x42 0x4D,然後4個字節的文件大小(0x36 0x65 0x01 0x00)。在轉儲你貼兩個字節5 - 8(BMP頭前)和(BMP頭後的文件大小)字節11-14是相同的,所以它看起來像斑點具有(猜測):

  • 4字節:某種特定應用的圖像類型NR
  • 4字節(?):文件大小(相同的0x42送出0x4d後)
  • 實際的位圖文件

您可能要檢查,如果跳過第一8字節足以讓它工作,然後我會檢查這是否是所有文件通用的(也許有多個文件類型!)

+1

跳過前8個字節就像一個魅力。我用了一個簡單的substr(),它工作。感謝你的回答。 – Med