Boto3和dropzone.js导致S3图片上传错误

时间:2018-07-23 10:07:46

标签: django amazon-s3 boto3 dropzone.js

使用此API,我可以使用Postman将文件上传到S3。

我给出了文件“ /home/user/Downloads/black-rose.png”的直接路径

header_logo = request.data['header_logo']

#local file path
data = open(header_logo, 'rb')

s3 = boto3.resource(
     's3',
     aws_access_key_id=ACCESS_KEY_ID,
     aws_secret_access_key=ACCESS_SECRET_KEY,
     config=Config(signature_version='s3v4')
 )
#generatre a random url
header_logo = "header_logo/" + get_random_string(length=20) + ".png"

#AWS foler & file name with public access
s3.Bucket(BUCKET_NAME).put_object(Key=header_logo, ContentType = 'image/png', Body=data, ACL='public-read')

当我提供直接文件路径的功能时,但是我的前端开发人员说他不能使用javascript提供直接文件路径,因此他正在使用插件“ dropzonejs”来加密文件路径,从而得到这样的文件

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAgAElEQVR4Xoy9B7hlZ3Xe/9u9nH5uL3OnabqkkTTqCFVAgA2SwQaX4GATHIc/DiFg

直接将这些数据提供给api会引发错误

1 个答案:

答案 0 :(得分:1)

您只需要解码图像的base 64表示形式,然后上传解码结果,请注意,直到firs逗号的字符串的开头实际上不是图像的一部分,您需要修剪前缀。

import base64

image_string = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAgAElEQVR4Xoy9B7hlZ3Xe/9u9nH5uL3OnabqkkTTqCFVAgA2SwQaX4GATHIc/DiFg"

image_encoded = image_string[image_string.index(',') + 1:]

image_data = base64.b64decode(image_encoded)

然后您可以将图像数据上传到s3

s3.Bucket(BUCKET_NAME).put_object(Key=header_logo, ContentType = 'image/png', Body=image_data, ACL='public-read')