Как вытащить картинку из поля OLE из Access

11 июн. 2009 г. | | |

Недавно столкнулась с такой проблемой - надо было организовать работу с БД Access через php. Извращение в чистом виде, особенно, если учесть, что в бд были столбцы типа OLE, в которых хранились картинки. А эти картинки надо было отображать на странице. Долго искала решение, но так нигде и не нашла.
На одном из сайтов прочитала, что при сохранении картинки в столбец OLE Аксес добавляет заголовок. О длине этого заголовка точно известно не было - в одном месте утверждали, что он 78 байт, в другом - что зависит от региональных настроек. Час от часу не легче....
На самом деле, как показала практика, фиксированной длины у этого заголовка нет.
В итоге всех моих поисков, методом тыка я нашла собственное решение. И оно оказалось элементарно просто!!! В базе, с которой пришлось мне работать, все картинки были в основном в bmp-формате, поэтому я приведу пример кода для конкретного случая.
И так, для начала нужно подключиться к бд с помощью odbc (более подробно как сделать это описано тут):

$connection = odbc_connect( $dsn, $user, $pwd);

Далее делаем запрос на выборку поля с картинкой:

$result = odbc_exec($connection, "Select Foto From Users Where UserID=1");

Теперь надо извлечь данные. Тут есть одна тонкость. Так как картинка больше 4096 байт (это длина данных , возвращаемая по умолчанию для LONG столбцов ), то нужно указать, что хотим, нет, даже требуем! чтобы нам передали большее количество данных с помощью функции odbc_longreadlen:

if ($result!== FALSE)
{
odbc_longreadlen($result, 1048576);
odbc_fetch_row($result, 0);
$data = odbc_result($result, "Foto");

Стандартный bmp начинается со символов "BM". Так как Аксес добавляет свой заголовок к данным файла и в нем могут встречатится такое же сочетание букв, то искать начало нашей картинки будем после фразы "PBrush", которая находится в конце заголовка, который добавляет аксес. Дело за малым, осталось из полученных данных вырезать картинку и отправить ее в браузер:

$data = substr($data, strpos($data, "BM", strpos($data, "PBrush")));
header("Content-type: ".image_type_to_mime_type(IMAGETYPE_BMP));
echo $data;
exit;
}

Для форматов gif, png, jpeg понадобиться только искать соответствующий формату заголовок.
Для изображений, который были сохранены с отметкой Microsoft PhotoEditor 3.0, я так решения и не нашла :(

0 коммент.:

Отправить комментарий