base64到二进制转换的问题

时间:2016-08-16 21:56:19

标签: python image python-3.x base64

我有一个base64字符串,并希望使用Python 3将其作为JPEG文件写入。

file = request.json['file'] 
prefix = 'data:' + file['filetype'] + ';base64,' 
full_base64 = prefix + file['base64']
# full_base64 = data:image/jpeg;base64,/9j/4AAQSkZJ....
# base 64 verified with http://codebeautify.org/base64-to-image-converter

file_data = b64decode(full_base64)

with open('uploads/' + str(uuid.uuid4()) + '.jpeg', 'wb') as file:
    file.write(file_data)

但如果我尝试使用图像查看器打开文件,我会收到此错误:

Error interpreting JPEG image file (Not a JPEG file: starts with 0x75 0xab)

base64字符串似乎是正确的(我使用http://codebeautify.org/base64-to-image-converter验证了它),因此问题必须是b64encode或写入文件。

谢谢

1 个答案:

答案 0 :(得分:2)

如果要创建可由图像查看者读取的有效JPEG文件,则不应将数据URI添加到文件中。您仍然需要解码base64编码的图像数据。

with open('uploads/' + str(uuid.uuid4()) + '.jpeg', 'wb') as f:
    f.write(b64decode(file['base64']))

这将生成可由标准图像查看器打开的JPEG文件。

另外,请注意使用file作为变量名称 - 它会隐藏内置file

如果由于某种原因你想要创建包含数据URI的文件,例如要轻松插入HTML或CSS文件,那么你不需要解码传入的JPEG数据 - 它已经是base64编码的:

image = request.json['file'] 
prefix = 'data:' + image['filetype'] + ';base64,' 
data_URI = prefix + image['base64']
# data_URI = data:image/jpeg;base64,/9j/4AAQSkZJ....

with open('uploads/' + str(uuid.uuid4()) + '.jpeg', 'wb') as f:
    f.write(data_URI)

这只是将数据URI前缀添加到已经base64编码的数据中,并将其写入文件。