2014-02-06 104 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