我想上传图像到亚马逊s3使用预先签署的网址和图像是由用户选择的。所以我使用flask-wtf文件字段来创建文件输入字段。在用户提交表单(PostForm)后,我希望获得图像数据并将其发送到presigned-url。但是我不知道如何从表单中获取图像文件的信息。
请帮帮我!
我使用了下面教程中的示例代码。但不同的是我使用的是flask-wtf,而不是本地镜像文件。
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-presigned-urls.html
在下面的代码中,问题行在这里。
files = {'file': (save_objectname, image.read())}
http_response = requests.post(response['url'], data=response['fields'], files=files)
当我使用print(image.read())
时,它显示b'‘<-什么也没有...
我该如何修复它?
def create_post():
form = PostForm()
save_post_foldername = 'post_images'
if form.validate_on_submit():
if form.post_image.data:
image_file = form.post_image.data
save_post_objectname = generate_filename(image_file)
# Generate a presigned S3 POST URL
post_to_aws_s3(image_file, save_post_foldername, save_post_objectname)
def post_to_aws_s3(image, save_foldername, save_objectname):
fields = {
"acl": "public-read",
"Content-Type": image.content_type
}
conditions = [
{"acl": "public-read"},
{"Content-Type": image.content_type}
]
try:
response = s3_client.generate_presigned_post(
Bucket=S3_BUCKET,
Key=save_foldername+'/'+save_objectname,
Fields=fields,
Conditions=conditions,
ExpiresIn=600
)
print(response)
print(response['url'])
print(image.content_type)
#with open(image, 'rb') as f:
#files = {'file': ('abc.png', f)}
#files = {'file': (image, f)}
files = {'file': (save_objectname, image.read())}
http_response = requests.post(response['url'], data=response['fields'], files=files)
print(image.read())
except ClientError as e:
print("error")
发布于 2020-01-17 15:18:27
Access_ID和secret ID指的是您的亚马逊网络服务用户访问id和密钥,因为boto3将使用您分配给它的用户来访问您的亚马逊网络服务s3。
s3 = boto3.resource("s3", aws_access_key_id=os.getenv("ACCESS_ID"), aws_secret_access_key=os.getenv("ACCESS_SECRET_ID"))
s3.Bucket("[NAME OF BUCKET]").put_object(Key="images/"+request.files["image"].filename, Body=request.files["image"] )
确保在表单下的jinja下包含"enctype“,例如
<form method="POST" action="" enctype="multipart/form-data">
https://stackoverflow.com/questions/57908060
复制