KineticJS toDataURL()在Python中给出了不正确的填充错误

时间:2013-10-25 00:27:10

标签: python kineticjs decoding

我有一个我从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 /更改为/ my / image'到计算机上的任意位置
  • 将编码后的文本变量传递给名称为
  • 的函数
  • 查看输出

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

1 个答案:

答案 0 :(得分: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。