【问题标题】:How to get the aws s3 object key using django-storages and boto3如何使用 django-storages 和 boto3 获取 aws s3 对象密钥
【发布时间】:2017-11-19 20:56:09
【问题描述】:

我将 django-storage 和 boto3 用于使用 aws s3 的媒体和静态文件。我需要获取 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。

【问题讨论】:

  • 那个对象的URL。 S3 存储桶为 django-bucket,S3 密钥为 media/user_image/1497598249_49.jpeg。
  • @jarmod 是的。但是有没有办法使用 boto3 或 django 存储包以编程方式获得这个?或者我应该使用拆分/替换或一些正则表达式从图像的 url 中获取它?
  • 为什么设置AWS_QUERYSTRING_AUTH = False?对文档的快速检查表明,如果将其设置为默认值 Trueui.image.url自动返回一个预签名的 URL——您不必生成一个。跨度>
  • @Michael-sqlbot 哦!我不知道。我认为AWS_QUERYSTRING_AUTH = False 将成为公开静态文件的首选。有什么方法可以回复该预签名的 url 并更改其标题,基本上是 ContentDisposition 和 ContentType,以便可以下载?或者我应该更改AWS_QUERYSTRING_AUTH = True 以使其正常工作?
  • 我发现自己想要获取文件的密钥,因为这似乎是唯一查询文件是否实际存在的方法。出现对象已创建但未实际保存在 aws s3 中的情况。

标签: django amazon-s3 boto boto3 django-storage


【解决方案1】:

似乎前缀可以从文件字段“存储”位置值和文件“名称”(这是从“位置”到文件的路径 - 它包括我们大多数人认为的文件名')。

下面是一个可以完成工作的函数的快速演示:

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 由于错误或只是因为它以某种方式保存(或“/”如果未设置位置)而返回空字符串,则仅以位置结束

【讨论】:

    【解决方案2】:

    您可以通过以下方式获取s3 Object key:

    ui = UserImage.objects.get(user=user_id, image=image_id)
    bucket_key = ui.image.file.obj.key
    
    'media/user_image/1497598249_49.jpeg'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 2020-05-27
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2016-08-05
      相关资源
      最近更新 更多