|
|
|
| Здравствуйте уважаемы специалисты. Столкнулся со следующей проблеммой. Есть база данных с таблицей, в которой хранятся изображения. Таблица вида ID; imgname; imgdata. Эту базу читаю скриптом написанном на Perl. Задача собственно в том чтобы перенести базу в MySQL а изображения выгрузить в отдельные файлы
И тут оказалось что двоичные данные выводятся с непонятными заголовками и соответственно нечитабельны. Поиск по проблеме привел к тому что в Access двоичные данные записываются "не просто так". Более менее внятный пример выгрузки приведен только для VB, в котором я не разбираюсь абсолютно.
Подскажите - как именно надо обработать данные для получения читабельного файла?
вывод для каждого файла начинается с этого
B7D3B4C2BDCA9991B7D4B4
C3BDC7ACB7AACDB4C1BDC
89991DCF1E7051603F1CBF9
FEA19B11998C87989C9DE41
110F8ECD8FC01F6A3A2DAF6
FC08F5FDBD0BF1FFFEA3DA0
.....
... и т.п.
|
что не соответствует ни одному граф. формату. Картинки в формате JPG | |
|
| |
|
|
|
| Из вашего сообщения неясно, что именно хранится в поле, бинарное содержимое файла или OLE object? Какой тип поля используется для хранения файла?
Думаю, что если бы в поле хранилось бинарное содержимое файла, то никаких заголовков там не было бы. | |
|
| |
|
|
|
| Прошу прощения.
база Access. Поле объекта OLE. В таблице просто указано "двоичные данные". При попытке просто открыть двойным щелчком пишет об ошибке подключения к OLE серверу.
Вообще данные изначально используются программмой написанной на Дельфи.
Тот же шестнадцатиричный код можно увидить если из таблицы создать "страницу доступа к данным".
Под заголовком я имел ввиду File Header он же "сигнатура файла" | |
|
| |
|
|
|
| >Вообще данные изначально используются программмой написанной
>на Дельфи.
Видимо отсюда и надо копать. Каким образом данные были занесены в таблицу? | |
|
| |
|
|
|
| если бы я знал, или были б исходники - я бы посмотрел алгоритм того как они оттуда выбираются и не беспокоил бы вас :)
очевидно что данные должны соответствовать каким то стандартам раз используется база access.
Насколько я понял из пояснений с сайта microsoft данные пишуться блоками, каждый из которых как то обрабатывается, но вот КАК я не понял | |
|
| |
|
|
|
| Если в поле нужно хранить просто двоичные данные, то никаким стандартам эти данные не должны соответствовать и никакого заголовка сам Access к данным не добавляет. В поле хранится та последовательность байт, которые ему переданы. А блоками (SetChunk) писать данные необязательно и делается это лишь для экономии памяти. Не ищите причину в Access, причина в том каким образом эти данные записывались и использовались. | |
|
| |
|
|
|
| в качестве источника информации я нашел вот эти две статьи:
http://support.microsoft.com/kb/103257
http://www.codenet.ru/progr/vbasic/Database-Images.php
откуда я и сделал вывод о том что данные пишуться именно блоками | |
|
| |
|
|
|
| Мне нечего добавить к тому, что я написал, кроме того, что я неправильно обозвал метод (написал SetChunk вместо AppendChunk).
В данном случае способ записи (блоками определенного размера или сразу целиком) никак не скажется на результате - в поле будет одно и то же. Не фиксируйте свое внимание на этом. | |
|
| |
|
|
|
| К сожалению я не достаточно силен в Access. И, до последнего времени, не было необходимости подробно изучать. Однако как я понял в процессе поиска данная проблема- сохранение и чтение изображений в базе данных в формате BLOB имеет довольно большое распространение. В качестве одного из примеров я скачал демонстрационную базу http://accdevel.tripod.com , где поаказаны разные методы сохранения изображений и как BLOB и как OLE. так вот - ни в том ни в другом случае содержимое файла ( я имею ввиду HEX-представление) не сохраняется в исходном виде, а подвергается предварительной (и пост - при чтении) обработке. Т.е. ПОБАЙТОВО прочитать содержимое поля таблицы и скопировать в файл не получится - то есть как раз та самая ситуация что у меня сейчас. Вот я и пытаюсь выяснить как именно необходимо обрабатывать данные.
p.s.: очевидно существует какая то причина, по которой в прямом виде содержимое не записывают в базу
p.p.s: Собственно, я буду очень благодарен если Вы опишите алгоритм обработки этих самых блоков для возвращения исходного вида двоичным данным файла. Мне необходимо повторить его в другом языке. Т.е. прочитать поле - что то с ним сделать - записать в файл на диск | |
|
| |
|
|
|
| >- ни в том ни в другом случае содержимое файла ( я имею ввиду HEX-представление)
>не сохраняется в исходном виде, а подвергается предварительной
>(и пост - при чтении) обработке.
покажите, в чем заключается обработка, изменяющая содержимое, на примере функций ReadBLOB и WriteBLOB.
>Т.е. ПОБАЙТОВО прочитать содержимое поля таблицы
>и скопировать в файл не получится - то есть как раз та самая
>ситуация что у меня сейчас.
Я не знаю почему вы делаете такой вывод
>p.s.: очевидно существует какая то причина, по которой в прямом виде содержимое не >записывают в базу
Мне эта причина неочивидна и неизвестна, я всегда записываю содержимое файла в прямом виде. | |
|
| |
|
12 Кб. |
|
| Прилагаю mdb с табличкой, содержащей поле OLE, и двумя процедурами
ReadFile(ByVal vstrFilename As String) и WriteFile(ByVal vstrFilename As String)
Никакого преобразования данных они не производят.
Выполните из окна отладки (Immediate window)
ReadFile ПутьИИмяВашегоФайла.jpg
а затем
WriteFile ПутьИИмяКопииФайла.jpg
а потом сравните, есть ли отличия в этих файлах. | |
|
| |
|
|
|
| да, в вашем примере не отличается :(
а теперь попробуйте http://accdevel.tripod.com/Downloads/ImagesA2K.ZIP
там отличается до неузнаваемости. в общем, судя по всему, кто во что горазд и прочитать этот файл без исходников родной программы не удастся :( | |
|
| |
|
|
|
|
Поле объекта OLE. В таблице просто указано "двоичные данные".
При попытке просто открыть двойным щелчком пишет об ошибке подключения к OLE серверу.
Вообще данные изначально используются программмой написанной на Дельфи
| .
Смею предположить, что программа на дельфи, сохраняет (извлекает) данные по какому-то своему алгоритму... | |
|
| |
|
|
|
| >Смею предположить, что программа на дельфи, сохраняет
>(извлекает) данные по какому-то своему алгоритму...
Я давно об этом говорю, но ... | |
|
| |
|
|
|
| после более глубокого "вкуривания" проблемы потихоньку прихожу к выводу что это именно ограничение delphi. Спасибо и извините за беспокойство | |
|
| |