Загрузка напрямую в S3 - PullRequest
0 голосов
/ 01 ноября 2018

Я очень старался реализовать этот учебник в моем проекте 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)

На самом деле, когда я смотрю в веб-консоль, я вижу:

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

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

На самом деле я выяснил, в чем проблема. В своей подписи я упомянул, что срок действия URL истечет через 3600 с. Вы также должны сообщить об этом в CORS.

Мой ковш 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>
0 голосов
/ 01 ноября 2018

Проверьте конфигурацию CORS вашего сегмента S3. Конфигурацию CORS можно найти на вкладке разрешений вашего сегмента S3 в консоли AWS.

Вы, вероятно, увидите значение по умолчанию:

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

Вам нужно будет обновить его, чтобы разрешить вашему веб-сайту (www.example.com) выставлять POST / PUT: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTcors.html

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

    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>

    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...