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

KineticJS toDataURL()在Python中给出了不正确的填充错误,python,kineticjs,decoding,Python,Kineticjs,Decoding,我有一个从KineticJS toDataURL()获取的base64字符串。它是一个有效的base64字符串。这把小提琴表明它是: 我的问题:我将这个数据URI发送到我的服务器,使用python进行解码,并保存到服务器上。但是,我得到了一个填充错误。这是我的密码: def base64_to_file(self, image_data, image_name): extension = re.search('data\:image\/(\w+)\;', image_data)

我有一个从KineticJS toDataURL()获取的base64字符串。它是一个有效的base64字符串。这把小提琴表明它是:

我的问题:我将这个数据URI发送到我的服务器,使用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,只是一张破碎的图像有什么帮助?非常感谢您的帮助。我已经在这件事上花了太多时间了

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

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

再说一次,任何帮助都会很棒。谢谢。

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

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

>>> len(image_data)
223548
>>> import hashlib
>>> hashlib.md5(image_data).hexdigest()
'03918c3508fef1286af8784dc65f23ff'
如果您的URI仍然包含
数据:
前缀,请将其解析出来:

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

还有别的问题;我不能重现你的错误。JSFiddle中的数据直接解码为base 64,无需添加额外的填充,并解码为有效的PNG图像。检查
image\u数据
字符串是否未被截断<代码>镜头(图像数据)=223548对我来说<代码>导入hashlib;hashlib.md5(image_data).hexdigest()=“03918c3508fef1286af8784dc65f23ff”@MartijnPieters非常感谢!我检查了长度,得到了223573,我觉得非常奇怪。然后我注意到数据:image/png;base64,base64图像数据中的子字符串。我不知道我应该移除它,一旦我移除,它立即开始工作。如果你想写一个关于名誉的答案,那很好,否则我可以自己回答;如果你觉得我应得赏金,也别忘了给我赏金!:-)