我是新手的S3并且我正在尝试构建一个允许用户使用boto3直接将文件上传到S3的Web应用程序。
用户首先向我自己的服务器发送请求(例如https://example.com),我的网络应用程序(用python Flask编写)有一个表单,允许用户上传文件。然后,此应用程序将允许用户使用经过身份验证的请求(AWS身份验证签名版本4)将文件直接上载到S3。
我基本上遵循了此网址中的步骤(https://devcenter.heroku.com/articles/s3-upload-python)。 请注意,我没有使用Heroku来构建我的Web服务器。我在另一家软管公司有自己的服务器。
因此,当我在字段和条件中不指定“success_action_redirect”时,代码可以正常工作。 如果我想将用户重定向到我自己的服务器,如果上传成功。代码不起作用。错误消息如下所示。
"XMLHttpRequest cannot load https://test1.s3.amazonaws.com/. Cross-origin redirection denied by Cross-Origin Resource Sharing policy."
这是我的python代码块。
@app.route('/sign_s3/')
def sign_s3():
file_name = 'testfd/' + request.args.get('file_name')
file_type = request.args.get('file_type')
s3 = boto3.client("s3", aws_access_key_id=AWS_ID,aws_secret_access_key=AWS_KEY)
presigned_post = s3.generate_presigned_post(Bucket = AWS_BUCKET, \
Key = file_name,Fields = {"acl": "public-read", "Content-Type": file_type, "success_action_redirect":"https://example.com" }, \
Conditions = [{"acl": "public-read"},{"Content-Type": file_type}, { "success_action_redirect": "https://example.com"}],\
ExpiresIn = 3600)
result_json = json.dumps({'data': presigned_post,\
'url': 'https://%s.s3.amazonaws.com/%s' % (AWS_BUCKET, file_name)})
return result_json
此外,这是CORS配置。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin> https://example.com </AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我看过其他帖子的讨论,但都没有奏效。我也在条件中尝试了两个选项,它仍然不起作用。任何想法都表示赞赏!
{"success_action_redirect": "https://example.com"} or {"success_action_redirect": "https://example.com/uploadOK.html"}