1

我有一个从 KineticJS toDataURL() 获得的 base64 字符串。这是一个有效的 base64 字符串。这个小提琴表明它是:http: //jsfiddle.net/FakRe/

我的问题:我将这个 dataURI 发送到我的服务器,使用 python 解码,并保存在服务器上。但是,我收到填充错误。这是我的代码:

def base64_to_file(self, image_data, image_name):

    extension = re.search('data\:image\/(\w+)\;', image_data)
    if extension:
        ext = extension.group(1)
        image_name = '{0}.{1}'.format(image_name, ext)
    else:
        # it's not in a format we understand
        return None

    image_data = image_data + '=' #fix incorrect padding
    image_path = os.path.join('/my/image/path/', image_name)
    image_file = open(image_path, 'w+')
    image_file.write(image_data.decode('base64'))
    image_file.close()
    return image_file

我可以通过在我的函数顶部执行此操作来解决此填充错误:

image_data = image_data + '=' #fixes incorrect padding

添加任意填充后,它会成功解码并写入文件系统。但是,每当我尝试查看图像时,它都不会渲染,并给我一个“损坏的图像”图标。没有 404,只是一个损坏的图像。是什么赋予了?任何帮助将不胜感激。我已经在这方面花费了太多时间。

重新创建的步骤(可能很迂腐,但我会尽力提供帮助)

  • 从 JSFiddle 中获取 base64 字符串
  • 将其保存到文本文件
  • 在python中打开文件,读入数据,保存到变量
  • 将函数中的“/path/to/my/image”更改为您机器上的任何位置
  • 将您的编码文本变量传递到具有名称的函数中
  • 查看输出

同样,任何帮助都会很棒。谢谢。

4

1 回答 1

3

如果你需要添加填充,你有错误的字符串。确保正确解析数据 URI;该data:image/png;base64,部分是关于编码值的元数据,只有逗号后面的部分是实际的 Base64 值。

实际数据部分的长度为 223548 个字符:

>>> len(image_data)
223548
>>> import hashlib
>>> hashlib.md5(image_data).hexdigest()
'03918c3508fef1286af8784dc65f23ff'

如果您的 URI 仍然包含data:前缀,请解析它:

from urllib import unquote

if image_data.startswith('data:'):
    params, data = image_data.split(',', 1)
    params = params[5:] or 'text/plain;charset=US-ASCII'
    params = params.split(';')
    if not '=' in params[0] and '/' in params[0]:
        mimetype = params.pop(0)
    else:
        mimetype = 'text/plain'
    if 'base64' in params:
        # handle base64 parameters first
        data = data.decode('base64')
    for param in params:
        if param.startswith('charset='):
            # handle characterset parameter
            data = unquote(data).decode(param.split('=', 1)[-1])

然后,这使您可以就图像 URL 使用什么扩展做出一些更明智的决定,例如,因为您现在也解析了 mimetype。

于 2013-10-28T17:49:07.823 回答