如何使用 s3 作为存储在 django 中自动显示媒体文件?
How do I make media files display automatically in django using s3 as storage?
我这样配置了我的 s3 设置:
DEFAULT_FILE_STORAGE = 'Bonychicken.storage_backends.MediaStorage'
AWS_STORAGE_BUCKET_NAME = 'bonychicken'
AWS_S3_REGION_NAME = 'us-east-2'
AWS_ACCESS_KEY_ID = '<my access key id>'
AWS_SECRET_ACCESS_KEY = '<my secret access key>'
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com"
AWS_QUERYSTRING_AUTH = False
AWS_DEFAULT_ACL = None
STATIC_URL = '/static/'
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
MEDIA_ROOT = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
AWS_IS_GZIPPED = True
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
我的存储 class 是:
from storages.backends.s3boto3 import S3Boto3Storage
class MediaStorage(S3Boto3Storage):
bucket_name = 'bonychicken'
location = 'media'
file_overwrite = False
我将 storages
添加到已安装的应用程序中,并且还安装了 boto3
。
CORS 配置为:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
block public access
已关闭。
IAM
用户拥有存储桶的权限。
问题是,每当我上传文件时,它都会上传到我的 s3 存储桶,但不会显示在 html 页面上。尝试从源代码访问图像 url 会产生:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId><random letters here></RequestId>
<HostId>
<random letters here>
</HostId>
</Error>
但是如果我转到我的存储桶设置和 select actions
并在标记媒体文件后单击 make public
,一切都会开始工作。这意味着对于每张上传的图片,我都必须一遍又一遍地标记和重复。
我该如何解决这个问题?
我认为您应该更改 AWS 设置中的默认 ACL,如 docs 所示。
只需将 AWS_DEFAULT_ACL
设置为 AWS_DEFAULT_ACL='public-read'
。
我这样配置了我的 s3 设置:
DEFAULT_FILE_STORAGE = 'Bonychicken.storage_backends.MediaStorage'
AWS_STORAGE_BUCKET_NAME = 'bonychicken'
AWS_S3_REGION_NAME = 'us-east-2'
AWS_ACCESS_KEY_ID = '<my access key id>'
AWS_SECRET_ACCESS_KEY = '<my secret access key>'
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com"
AWS_QUERYSTRING_AUTH = False
AWS_DEFAULT_ACL = None
STATIC_URL = '/static/'
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
MEDIA_ROOT = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
AWS_IS_GZIPPED = True
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
我的存储 class 是:
from storages.backends.s3boto3 import S3Boto3Storage
class MediaStorage(S3Boto3Storage):
bucket_name = 'bonychicken'
location = 'media'
file_overwrite = False
我将 storages
添加到已安装的应用程序中,并且还安装了 boto3
。
CORS 配置为:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
block public access
已关闭。
IAM
用户拥有存储桶的权限。
问题是,每当我上传文件时,它都会上传到我的 s3 存储桶,但不会显示在 html 页面上。尝试从源代码访问图像 url 会产生:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId><random letters here></RequestId>
<HostId>
<random letters here>
</HostId>
</Error>
但是如果我转到我的存储桶设置和 select actions
并在标记媒体文件后单击 make public
,一切都会开始工作。这意味着对于每张上传的图片,我都必须一遍又一遍地标记和重复。
我该如何解决这个问题?
我认为您应该更改 AWS 设置中的默认 ACL,如 docs 所示。
只需将 AWS_DEFAULT_ACL
设置为 AWS_DEFAULT_ACL='public-read'
。