Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: OLE объекты
 
 автор: Саня   (28.04.2009 в 20:25)   письмо автору
 
 

У меня есть база интернет магазина в формате mdb (MS Access, если кто не знает). В таблице с товарами есть поле типа "Поле объекта OLE", в котором хранится картинка. В PHP при выборке из БД данные в этом поле имеют вид: "151C33000200000011000E0014002500... и так ещё 610000 символов". var_dump говорит что это строка.
<?
$dsn 
'odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\magazin\\db.mdb;Uid=Admin';
try {

  
$dbh = new PDO($dsn);
  
$q $dbh->query('SELECT * FROM VID_TOVARA');
  
//print_r($dbh->errorInfo());
  
$q->setFetchMode(PDO::FETCH_ASSOC);
  
  
$one $q->fetch();
  print 
var_dump($one['Foto']);

} catch (
PDOException $e) {
  echo 
'Connection failed: ' $e->getMessage();
}

Шаманские махинации вроде createimagefromstring() или прямой вывод со всякими заголовками Content-Type ни к чему не привёл.

Что делать? Подозреваю что нужно сделать что-то типа такого:
<?
//...
$img = new COM('Ole.Image');
$img->GetFromString($one['Foto']);
$img->FetchToOutput();
Но этот код, конечно же, не работает.

Сразу оговорюсь что перенос данных на другую СУБД или изменение типа поля не приемлемы.

  Ответить  
 
 автор: Trianon   (28.04.2009 в 21:30)   письмо автору
 
   для: Саня   (28.04.2009 в 20:25)
 

вывели бы эту строку в файл и прикрепили бы в архиве к посту.
Понятно, что она закодирована и в лоб её толкать в GD2 смысла нет.

  Ответить  
 
 автор: Саня   (28.04.2009 в 22:09)   письмо автору
595.7 Кб
 
   для: Trianon   (28.04.2009 в 21:30)
 

Я полагаю что это сериализованный OLE объект.

  Ответить  
 
 автор: Саня   (01.05.2009 в 10:45)   письмо автору
 
   для: Trianon   (28.04.2009 в 21:30)
 

Никаких идей?

  Ответить  
 
 автор: Trianon   (01.05.2009 в 12:01)   письмо автору
 
   для: Саня   (01.05.2009 в 10:45)
 

у меня - нет.

  Ответить  
 
 автор: nikita2206   (01.05.2009 в 13:13)   письмо автору
 
   для: Саня   (01.05.2009 в 10:45)
 

тоесть это изображение должно быть?
насколько я помню, изображения считаются бинарными данными, а у вас 16-ричные...

  Ответить  
 
 автор: Саня   (02.05.2009 в 12:12)   письмо автору
 
   для: nikita2206   (01.05.2009 в 13:13)
 

Если бы они были записаны в базу в бинарном формате, то никаких проблем. Но в первом посте я написал что это OLE-объект.

  Ответить  
 
 автор: Саня   (05.05.2009 в 18:36)   письмо автору
297.9 Кб
 
   для: Саня   (28.04.2009 в 20:25)
 

Кое что прояснилось. Мне тут подсказали:
<?
$str 
preg_replace_callback ("([a-zA-Z0-9]{2})"create_function ('$matches''return chr (hexdec ($matches[0]));'), $str);

Среди бинарных данных плавают "Точечный рисунок" и "Paint.Picture". Значит разгадка где-то близко.

Помимо всего прочего попробовал PEAR::OLE, но тоже не помогло.

  Ответить  
 
 автор: sim5   (05.05.2009 в 19:17)   письмо автору
 
   для: Саня   (05.05.2009 в 18:36)
 

OLE, это же контейнер, значит надо сперва получить рисунок из контейра как-то, а он получается содержится в каком-то внутреннем формате.... что-то не видно в тексте заголовков знакомых.

  Ответить  
 
 автор: Trianon   (06.06.2009 в 16:55)   письмо автору
21.1 Кб
 
   для: sim5   (05.05.2009 в 19:17)
 

sim5, пардон, промахнулся....

Саня:
такой чтоли рисунок?
bmp-файл там начиная с символов BM и далее...

  Ответить  
 
 автор: sim5   (06.06.2009 в 16:56)   письмо автору
 
   для: Trianon   (06.06.2009 в 16:55)
 

Красивая печка :) Не знаю, я же не создавал этого объекта, спросите у Сани :)

PS. Да, видел я там BMNS - а дальше смотреть поленился, пудумав, что это нечто свое из формата.)

  Ответить  
 
 автор: tan4eg   (06.06.2009 в 16:35)   письмо автору
 
   для: Саня   (05.05.2009 в 18:36)
 

Мучаюсь с такой же проблемой, нужно срочно найти решение...
Нагуглено, что есть хеадер в оле длиной 78 байт. Но даже если отрезать эти 78 байт, то ничего не получается...
Был вариант отображать изображения как встроенный object с типом application/x-oleobject...
Если найдете решение, поделитесь, пожалуйста!

  Ответить  
 
 автор: Trianon   (06.06.2009 в 17:03)   письмо автору
 
   для: tan4eg   (06.06.2009 в 16:35)
 

после этих 78 байт идут 4 байта, которые очень напоминают длину оставшегося куска в шестнадцатеричных цифрах. А после них - BMP.

  Ответить  
 
 автор: tan4eg   (06.06.2009 в 21:44)   письмо автору
 
   для: Trianon   (06.06.2009 в 17:03)
 

вот так они подготавливают картинку в асп. по идее, то же самое должно работать в пхп, ничего магического они не делают.... но не работает :(
function SetImageForDisplay(field, contentType)
    OLEHEADERSIZE = 78
    
    contentType = LCase(contentType)
    Select Case contentType
    Case "gif", "jpeg", "bmp"
    contentType = "image/" & contentType
    bytes = field.value 
    Case "ole"
    contentType = "image/bmp" 
    nFieldSize = field.ActualSize
    oleHeader = field.GetChunk(OLEHEADERSIZE)
    bytes = field.GetChunk(nFieldSize - OLEHEADERSIZE)
    End Select
    Session("ImageBytes") = bytes
    Session("ImageType") = contentType
    End function

  Ответить  
 
 автор: Trianon   (06.06.2009 в 17:01)   письмо автору
 
   для: Саня   (05.05.2009 в 18:36)
 

Месяц назад меня изрядно смутило то обстоятельство, что помимо шестнадцатеричного кода в потоке встречаются мелкие двоичные вкрапления....

Очевидно, либо они что-то означают, а я не знаю, что именно.
Либо экспорт формата уже был проведен с нарушениями.
И то и другое, понятное дело, правильный ответ только перечеркнуть может.

  Ответить  
 
 автор: tan4eg   (11.06.2009 в 12:31)   письмо автору
 
   для: Trianon   (06.06.2009 в 17:01)
 

Мое решение тут http://sly-and-fluffy.blogspot.com/2009/06/access-php.html

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования