我是否正确地从这个mysqldump中提取JPEG二进制数据?

时间:2010-04-27 18:39:10

标签: python mysql jpeg

我有一个非常古老的.sql备份的vbulletin网站,我在8年前跑了。我试图查看存储在数据库中的文件附件。下面的脚本全部提取它们,并通过十六进制转储并根据JPEG wiki page检查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字节是节标记,下一个字节表示节类型。我看到一些未在wiki页面中列出的内容(具体来说,我看到很多5C字节,所以FF5C)。但该列表是“常用标记”,所以我试图找到一个更完整的列表。这里的任何指导也将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用示例SQL语句更新您的问题,包括JPEG字符串值的几行/字节。也许数据是base64编码的,甚至是直的十六进制值。我们会进一步帮助您。

此外,通过发出:

更容易看到文件内容的类型
file yourfile.jpg