在Amazon S3对象上设置永不过期

时间:2017-12-12 13:39:43

标签: amazon-s3 timeout boto3 django-storage

我正在使用django-storage(内部使用Boto3)上传图片。我成功地能够这样做,我得到的返回URL是这种格式:

https://.s3.amazonaws.com/foo.jpg?Signature=&AWSAccessKeyId=&Expires=1513089114

其中也填写了Signature和AWSAccessKeyId。

现在,我需要将此URL直接提供给移动开发者,我不能设置这么晚的超时。我需要它多年或可能始终可访问。这样做的好方法是什么?解决方案是什么

4 个答案:

答案 0 :(得分:3)

在浏览django-storages S3 Docs时,我看到有一个

的规定

AWS_QUERYSTRING_EXPIRE陈述

  

生成的网址有效的秒数。

因此,如果您希望该链接从现在开始有效5年,您只需在此处添加相应的秒数,即 157784630

总而言之,只需在settings.py

中添加以下内容即可

AWS_QUERYSTRING_EXPIRE = '157784630'

这对我来说似乎不是一个好习惯,但更像是一个方便的黑客/解决方法。

答案 1 :(得分:2)

如果您的S3存储桶是公共的,则可以使用this setting关闭查询参数身份验证。

Setting AWS_QUERYSTRING_AUTH to False to remove query parameter authentication
from generated URLs. This can be useful if your S3 buckets are public.

答案 2 :(得分:1)

接受的答案几乎我想要的。我不想在应用程序范围内设置它,但仅限于特定文件。如果你像我一样,请继续阅读...

您可以使用具有可选expire kwargs的存储url() method来生成特定文件字段的到期日期:

post = Post.objects.first()
post.image.storage.url(post.image.name, expire=60*60*24*365)

这样做的缺点是它与Django的默认存储API不兼容,后者会在本地引发TypeError

TypeError: url() got an unexpected keyword argument 'expire'

答案 3 :(得分:0)

找到更好的解决方案,在S3BotoStorage Django中提供10年内FileField个文件的网址。在 settings.py

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' ...

解决方案是:

from django.core.files.storage import default_storage
from myapp.models import MyModel

myobj = MyModel.objects.first()
key = default_storage.bucket.new_key(myobj.file_field.name)
url = key.generate_url(expires_in=60*60*24*365*10)

url有效期为10年。