Как скачать медиа-файл из S3 Bucket в Django - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь загрузить файлы из моего медиа-каталога в S3. У меня следующий код загрузки:

def download_document(request, pk):
    service = Service.objects.get(pk=pk)
    file_path = os.path.join(settings.MEDIA_ROOT, service.pdf_file.name)
    print(file_path)
    file_mimetype = mimetypes.guess_type(file_path)
    if os.path.exists(file_path):
        with open(file_path, 'rb') as fh:
            response = HttpResponse(fh.read(), content_type=file_mimetype)
            response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
            return response

    raise Http404

В настройках я установил MEDIA_ROOT следующим образом:

if 'RDS_HOSTNAME' in os.environ:
    AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
    AWS_S3_OBJECT_PARAMETERS = {
        'CacheControl': 'max-age=86400',
    }
    DEFAULT_FILE_STORAGE = 'sme.storage_backends.MediaStorage'
    MEDIA_ROOT = 'https://%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME
else:
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Поэтому, когда я работаю локально, я храню носитель локально, но когда я запускаюсь наAWS я храню в ведре S3. Он работает как я ожидаю локально, но когда я пытаюсь применить корзину s3, я получаю файл, не существующий

1 Ответ

1 голос
/ 28 октября 2019

Первое, что я хотел бы проверить - можете ли вы на самом деле анонимно получить медиафайл с S3, чтобы отменить любую проблему, связанную с разрешениями. Используйте curl или wget.

Если вы не можете, тогда у вас есть два варианта:

  • Изменить политику корзины и ACL на общедоступные.
  • Установить учетные данные AWSи используйте boto3 для извлечения контента из S3.
...