javascript - 直接上传到S3

标签 javascript python django amazon-s3 cors

我非常努力地实现 this tutorial在我的 Django 项目上,但没有成功。我认为我用来签名的功能无法正常工作。 这是我的功能:

def sign_s3(request,*args, **kwargs):
  S3_BUCKET = getattr(settings, 'FILEMANAGER_AWS_S3_BUCKET_NAME')

  file_name = request.GET.get('file_name')
  file_type = request.GET.get('file_type')

  s3 = boto3.client('s3', 
                    config = S3ClientCfg(signature_version = 's3v4'),
                    aws_access_key_id=AWS_ACCESS_KEY_ID,
                    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                    )
  # s3 = get_aws_s3_client()

  presigned_post = s3.generate_presigned_post(
    Bucket = S3_BUCKET,
    Key = file_name,
    Fields = {"acl": "public-read", "Content-Type": file_type},
    Conditions = [
      {"acl": "public-read"},
      {"Content-Type": file_type}
    ],
    ExpiresIn = 3600
  )
  response_dict = {
    'data': presigned_post,
    'url': 'https://%s.s3.amazonaws.com/%s' % (S3_BUCKET, file_name)
  }
  mimetype = 'application/json'
  return HttpResponse(json.dumps(response_dict), mimetype)

实际上,当我查看 Web 控制台时,我看到:

Cross-Origin Request Blocked. (Reason: CORS request did not succeed)

最佳答案

其实我发现了问题所在。 在我的签名中,我提到 URL 将在 3600 秒后过期。 您还必须在 CORS 中发出此信号。

我的 Bucket CORS 应该如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3600</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

关于javascript - 直接上传到S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53094792/

相关文章:

python - Mandelbrot 设置平滑着色函数

python - 我可以用其他装置参数化 pytest 装置吗?

python - 断网后如何继续请求发帖

python - Django 无法识别多个数据库

javascript - 无法获得 ajax 响应以使用 python 代码放置好

java - 为什么是 GWT?使用此 RIA 框架的优势和权衡

javascript - 如何使用javascript检测android设备中的键盘关闭事件

python - 如何模拟我的函数之一的输出以进行单元测试?

php - 使用 mustache 通过 php 渲染 js 模板

javascript - 覆盖已经附加到事件的函数