“success_action_redirect”在基于浏览器的上传文件到S3的经过身份验证的请求中不起作用

时间:2017-07-15 05:25:02

标签: python amazon-s3 flask

我是新手的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"}

0 个答案:

没有答案