Django - 获取PIL Image保存方法以使用Amazon s3boto Storage

Kri*_*isF 7 django amazon-s3 boto python-imaging-library

为了在上传时调整图像大小(使用PIL),我正在覆盖我的文章模型的保存方法,如下所示:

def save(self):
    super(Article, self).save()
    if self.image:
        size = (160, 160)
        image = Image.open(self.image)
        image.thumbnail(size, Image.ANTIALIAS) 
        image.save(self.image.path)
Run Code Online (Sandbox Code Playgroud)

这在本地工作但在生产中我得到一个错误:NotImplementedError:这个后端不支持绝对路径.

我尝试用.替换image.save行

image.save(self.image.url)
Run Code Online (Sandbox Code Playgroud)

但后来我得到一个IOError:[Errno 2]没有这样的文件或目录:' https : //my_bucket_name.s3.amazonaws.com/article/article_images/2.jpg '

这是图像的正确位置.如果我将该地址放在浏览器中,则图像就在那里.我尝试了很多其他的东西,但到目前为止,没有运气.

min*_*ism 9

你应该尽量避免保存到绝对路径; 有一个File Storage API可以为您提取这些类型的操作.

查看PIL文档,看起来该save()函数支持传递类文件对象而不是路径.

我不在我可以测试此代码的环境中,但我相信你需要做这样的事情而不是你的最后一行:

from django.core.files.storage import default_storage as storage

fh = storage.open(self.image.name, "w")
format = 'png'  # You need to set the correct image format here
image.save(fh, format)
fh.close()
Run Code Online (Sandbox Code Playgroud)

  • 我通过更改第一行来实现它.我尝试编辑您的答案,意图在编辑批准后接受它,但编辑被拒绝.不知道为什么.以下是我添加/更改以使其正常工作的内容:从django.core.files.storage导入default_storage作为存储fh = storage.open(self.image.name,"w") (2认同)
  • 我在这里创建了损坏的图像,直到我将 `"w"` 更改为 `"wb"`(明确指定它是一个二进制文件)。不过,不确定需要进行此更改的条件是什么。 (2认同)