У меня есть очень старая резервная копия .sql сайта vbulletin, который я запускал около 8 лет назад. Я пытаюсь увидеть файловые вложения, которые хранятся в БД. Приведенный ниже скрипт извлекает их все и проверяется как JPEG с помощью шестнадцатеричного дампа и проверки байтов SOI (начало изображения) и EOI (конец изображения) (FFD8 и FFD9 соответственно) в соответствии с JPEG вики-страницей .
Но когда я пытаюсь открыть их с помощью evince, я получаю сообщение «Ошибка интерпретации файла изображения JPEG (поток данных JPEG не содержит изображения)»
Что здесь может происходить?
Некоторая справочная информация:
- sqldump около 8 лет
- vbulletin 2.x - программа, хранящая информацию
- скорее всего был использован php 4
- Скорее всего, MySQL 4.0, возможно, даже 3.x
- тип столбца, в котором хранятся эти вложения, - в среднем тексте
Мой скрипт на Python 3.1:
#!/usr/bin/env python3.1
import re
trim_l = re.compile(b"""^INSERT INTO attachment VALUES\('\d+', '\d+', '\d+', '(.+)""")
trim_r = re.compile(b"""(.+)', '\d+', '\d+'\);$""")
extractor = re.compile(b"""^(.*(?:\.jpe?g|\.gif|\.bmp))', '(.+)$""")
with open('attachments.sql', 'rb') as fh:
for line in fh:
data = trim_l.findall(line)[0]
data = trim_r.findall(data)[0]
data = extractor.findall(data)
if data:
name, data = data[0]
try:
filename = 'files/%s' % str(name, 'UTF-8')
ah = open(filename, 'wb')
ah.write(data)
except UnicodeDecodeError:
continue
finally:
ah.close()
fh.close()
обновление
На вики-странице JPEG написано, что байты FF являются маркерами раздела, а следующий байт указывает тип раздела. Я вижу некоторые из них, которых нет в вики-странице (в частности, я вижу много 5-байтовых байтов, поэтому FF5C). Но список "общих маркеров", поэтому я пытаюсь найти более полный список. Любое руководство здесь также будет оценено.