我有一个我从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,只是一张破碎的图像。 提供什么?非常感谢任何帮助。我已经花了太多时间在这上面。
重建的步骤(可能是迂腐但我会尽力帮助)
同样,任何帮助都会很棒。感谢。
答案 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。