![](/img/trans.png)
[英]500 error when uploading files with Filer to S3 using boto3 and django-storages on Elastic Beanstalk
[英]How to get the aws s3 object key using django-storages and boto3
我正在使用 aws s3 将 django-storage 和 boto3 用于媒体和静态文件。 我需要获取 aws s3 存储桶的对象键,以便我可以为该对象生成一个 url。
client = boto3.client('s3')
bucket_name = 'django-bucket'
key = ???
u = client.generate_presigned_url('get_object', Params = {'Bucket': bucket_name, 'Key': key,'ResponseContentType':'image/jpeg', 'ResponseContentDisposition': 'attachment; filename="your-filename.jpeg"'}, ExpiresIn = 1000)
这些在我的设置中:
STATICFILES_LOCATION = 'static'
MEDIAFILES_LOCATION = 'media'
STATICFILES_STORAGE = 'myproject.custom_storages.StaticStorage'
DEFAULT_FILE_STORAGE = 'myproject.custom_storages.MediaStorage'
AWS_ACCESS_KEY_ID = "my_access_key_id"
AWS_SECRET_ACCESS_KEY = "my_secret_access_key"
AWS_STORAGE_BUCKET_NAME = "django-bucket"
AWS_QUERYSTRING_AUTH = False
AWS_S3_CUSTOM_DOMAIN = AWS_STORAGE_BUCKET_NAME + ".s3.amazonaws.com"
# static media settings
STATIC_URL = "https://" + AWS_STORAGE_BUCKET_NAME + ".s3.amazonaws.com/"
MEDIA_URL = STATIC_URL + "media/"
ADMIN_MEDIA_PREFIX = STATIC_URL + "admin/"
我可以得到图像文件的文件路径
ui = UserImage.objects.get(user=user_id, image=image_id)
url = ui.image.url
'https://django-bucket.s3.amazonaws.com/media/user_image/1497598249_49.jpeg'
但我不知道如何获取 s3 对象键,以便我可以为该对象生成一个 url。
似乎可以从文件字段“存储”位置值和文件“名称”(这是从“位置”到文件的路径 - 它包括我们大多数人认为的文件“名称”)构建前缀')。
这是一个应该完成工作的函数的快速演示:
import os
def get_file_key(file_field):
return os.path.join(file_field.storage.location, file_field.name)
使用方法如下:
prefix = get_file_key(my_model_instance.relevant_file_field)
注意事项:
您可能希望根据您的需要在函数中/周围实现错误捕获完整性检查 - 例如,如果 file_field 为 None,该函数将引发 AttributeError - 在大多数情况下,您几乎肯定不想结束如果由于某种原因 field.name 由于错误或仅仅因为以某种方式保存而返回空字符串(如果未设置位置,则为 '/' )
您可以通过以下方式获取 s3 对象键:
ui = UserImage.objects.get(user=user_id, image=image_id)
bucket_key = ui.image.file.obj.key
'media/user_image/1497598249_49.jpeg'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.