如何从 Django 中的 S3 存储桶下载媒体文件
How to download media file from S3 bucket in Django
我正在尝试从 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 存储桶时,我得到的文件不存在
我要检查的第一件事是您是否真的可以从 S3 匿名检索媒体文件以丢弃任何与权限相关的问题。使用 curl 或 wget。
如果不能,那么你有两个选择:
- 将存储桶策略和 ACL 更改为 public。
- 设置 AWS 凭据并使用 boto3 从 S3 检索内容。
我正在尝试从 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 存储桶时,我得到的文件不存在
我要检查的第一件事是您是否真的可以从 S3 匿名检索媒体文件以丢弃任何与权限相关的问题。使用 curl 或 wget。
如果不能,那么你有两个选择:
- 将存储桶策略和 ACL 更改为 public。
- 设置 AWS 凭据并使用 boto3 从 S3 检索内容。