Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用django存储和boto3获取aws s3对象密钥_Django_Amazon S3_Boto_Boto3_Django Storage - Fatal编程技术网

如何使用django存储和boto3获取aws s3对象密钥

如何使用django存储和boto3获取aws s3对象密钥,django,amazon-s3,boto,boto3,django-storage,Django,Amazon S3,Boto,Boto3,Django Storage,我正在使用django存储和boto3,用于使用aws s3的媒体和静态文件。我需要获取aws s3 bucket的对象密钥,以便为该对象生成url client = boto3.client('s3') bucket_name = 'django-bucket' key = ??? u = client.generate_presigned_url('get_object', Params = {'Bucket': bucket_name, 'Key': key,'ResponseCont

我正在使用django存储和boto3,用于使用aws s3的媒体和静态文件。我需要获取aws s3 bucket的对象密钥,以便为该对象生成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。

似乎前缀可以从文件字段“存储”位置值和文件“名称”(这是从“位置”到文件的路径,其中包括我们大多数人认为的文件“名称”)构造而成

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)
下面是一个应该完成任务的函数的快速演示:

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_字段为None,函数将引发AttributeError-并且在大多数情况下,如果出于某种原因field.name返回空值,您几乎肯定不希望只得到位置由于错误或以某种方式保存的字符串(如果未设置位置,则为“/”)

这是对象的URL。S3存储桶是django存储桶,S3键是media/user掼u image/1497598249掼u 49.jpeg。@jarmod Yes。但是,有没有办法使用boto3或django存储包以编程方式实现这一点?或者我应该使用split/replace或一些正则表达式从图像的url获取它吗?为什么要设置
AWS\u QUERYSTRING\u AUTH=False
?对文档的快速检查表明,如果将其设置为默认值
True
ui.image.url
将自动返回一个预先签名的url——您不必生成一个。@Michael sqlbot噢!我不知道。我认为应该公开静态文件。有没有办法用预先签名的url回复并更改其标题,基本上是
ContentDisposition
和ContentType,以便可以下载?或者我应该更改
AWS\u QUERYSTRING\u AUTH=True以使其工作吗?我发现自己希望获得文件的密钥,因为这似乎是查询文件是否确实存在的唯一方法。出现了这样的情况:创建了对象,但实际上并没有保存在AWSS3中。