【问题标题】:How to download media file from S3 bucket in Django如何从 Django 中的 S3 存储桶下载媒体文件
【发布时间】:2020-02-24 00:17:06
【问题描述】:

我正在尝试从 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 存储桶时,我得到的文件不存在

【问题讨论】:

    标签: amazon-web-services amazon-s3 django-storage


    【解决方案1】:

    我要检查的第一件事是您是否真的可以从 S3 匿名检索媒体文件以丢弃任何与权限相关的问题。使用 curl 或 wget。

    如果你不能,那么你有两个选择:

    • 将存储桶策略和 ACL 更改为公开。
    • 设置 AWS 凭证并使用 boto3 从 S3 检索内容。

    【讨论】:

    • 我可以访问它 - 我在那里有打印声明,看看它正在接收什么。如果我将该输出复制到浏览器 url 中,那么它会立即获取文件
    • @HenryM 你能用 curl 或 wget 测试吗?在调试 S3 时,我经常发现在浏览器上我可以获取公开文件,但这实际上是误报,因为我有一个 AWS 会话 cookie。它已经发生了几次,问题总是与政策有关。你能告诉你得到的确切错误是什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2015-05-20
    • 2017-02-16
    • 2013-10-15
    • 2019-09-06
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多