我有一个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
或写入文件。
谢谢
答案 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编码的数据中,并将其写入文件。