2014-02-06 6 views
1

Итак, у меня есть эта база данных firebird со столбцом «фото», который я пытаюсь отобразить.Отображение данных blob из базы данных firebird с использованием PHP

Вот что я сделал до сих пор:

  • Поскольку тип контента неизвестен (я не тот, кто создал базу данных, и нет колонного с указанием типа).
  • Из первых 20 символов данных blob, я думаю, это 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); 

Как вы можете видеть, я пытался:

  • Отображение данных больших двоичных объектов с помощью "ibase_blob_echo"
  • Показать клякса с помощью IMG тег
  • Сохраните его как файл

Первый показывает необработанные данные blob, второй ничего и третий результат в поврежденном файле.

Относительно Content-заголовок типа я пробовал

  • изображение/BMP, х-портативный-растровый, х-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 имеет 0x42 0x4D в позиции 0, а затем 4 байта размера файла (0x36 0x65 0x01 0x00). В свалке вы вывесили как байты 5 - 8 (до заголовка BMP) и байты 11-14 (размер файла после заголовка BMP) являются одинаковыми, так что выглядеть капля имеет (догадок):

  • 4 байты: Some Kind применение конкретного типа изображений Н.Р.
  • 4 байт (?): размер файла (так же, как после 0x42 0x4D)
  • Фактических растрового файл

Вы можете проверить, если пропуская первый 8 байт достаточно, чтобы заставить его работать, тогда я бы проверил, является ли это общим для всех файлов (возможно, существует более одного типа файлов!)

+1

Ну, пропуская первые 8 байт, как шарм. Я использовал простой substr(), и он сработал. Спасибо за ответ. – Med

Смежные вопросы