我是否正确提取了这个mysqldump中的JPEG二进制数据?
我有一个很旧的 .sql 备份,里面是我大约 8 年前运行的 vbulletin 网站的数据。我想查看存储在数据库中的文件附件。下面的脚本可以提取所有附件,并且通过十六进制转储来验证它们是 JPEG 格式的,检查了图像的开始(SOI)和结束(EOI)字节(分别是 FFD8 和 FFD9),这些信息可以在JPEG 维基页面上找到。
但是,当我尝试用 evince 打开这些文件时,出现了这个错误信息:“解析 JPEG 图像文件时出错(JPEG 数据流不包含图像)”。
这可能是什么原因呢?
一些背景信息:
- 这个 sqldump 大约有 8 年的历史
- 存储这些信息的软件是 vbulletin 2.x
- 很可能使用的是 php 4
- 很可能使用的是 mysql 4.0,甚至可能是 3.x
- 这些附件存储的列数据类型是 mediumtext
我的 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 字节是段标记,接下来的字节表示段的类型。我看到一些不在维基页面上的字节(特别是,我看到很多 5C 字节,也就是 FF5C)。不过,那个列表只是“常见标记”,所以我想找一个更完整的列表。如果有任何建议,我也会很感激。
1 个回答
1
请在你的问题中添加一个示例的SQL语句,并附上一些JPEG字符串值的几行或几字节。可能这些数据是经过base64编码的,或者是直接的十六进制值。我们会进一步帮助你。
另外,通过执行以下命令,可以更容易地查看文件内容的类型:
file yourfile.jpg