在我的项目中,我已经配置并正常工作 S3 storages。现在我正在尝试使用s3 direct配置直接上传到 s3 。它几乎可以正常工作。用户可以上传图像并将其存储在 S3 中。当我在数据库中保存对图像的引用时,问题就来了。
模型.py
class FullResPicture(Audit):
docfile = models.ImageField()
picture = models.OneToOneField(Picture, primary_key=True)
设置.py
...
S3DIRECT_DESTINATIONS = {
# Allow anybody to upload jpeg's and png's.
'imgs': ('uploads/imgs', lambda u: u.is_authenticated(), ['image/jpeg', 'image/png'], 'public-read','bucket-name'),
}
...
视图.py
#Doc file is the url to the image that the user uploaded directly to S3
#https://s3-eu-west-1.amazonaws.com/bucket/uploads/imgs/picture.jpeg
fullRes = FullResPicture(docfile = form_list[1].cleaned_data['docfile'])
因此,如果我查看我的数据库,我有一些工作正常的图像(那些我只使用 django-storages 上传的图像),其 docfile 值如下:
images/2015/08/11/image.jpg
当应用程序尝试访问这些图像时,S3 boto 能够正确获取图像。
但是后来我直接从用户的浏览器上传了图像。对于那些,我存储了完整的 url,所以它们在数据库中看起来像这样:
https://s3-eu-west-1.amazonaws.com/bucket/uploads/imgs/Most-Famous-Felines-034.jpg
当应用程序尝试访问它们时,我遇到了这个异常:
File "/Users/mariopersonal/Documents/dev/venv/pictures/lib/python2.7/site-packages/django/db/models/fields/files.py", line 49, in _get_file
self._file = self.storage.open(self.name, 'rb')
File "/Users/mariopersonal/Documents/dev/venv/pictures/lib/python2.7/site-packages/django/core/files/storage.py", line 35, in open
return self._open(name, mode)
File "/Users/mariopersonal/Documents/dev/venv/pictures/lib/python2.7/site-packages/storages/backends/s3boto.py", line 363, in _open
name = self._normalize_name(self._clean_name(name))
File "/Users/mariopersonal/Documents/dev/venv/pictures/lib/python2.7/site-packages/storages/backends/s3boto.py", line 341, in _normalize_name
name)
SuspiciousOperation: Attempted access to 'https:/s3-eu-west-1.amazonaws.com/bucket/uploads/imgs/Most-Famous-Felines-034.jpg' denied.
显然,S3 boto 不喜欢将文件引用作为完整的 url。
出于故障排除的目的,我尝试对保存的值进行硬编码,因此它只保存最后一部分,而不是完整的 url,但是当它尝试访问图像时,我遇到了另一个异常:
IOError: File does not exist: uploads/imgs/Most-Famous-Felines-034.jpg
有人知道这里出了什么问题吗?有没有人有任何直接上传到 s3 的工作示例,它将对上传文件的引用存储在模型中?
谢谢。