首页 > 解决方案 > 为什么img.thumbnail调整会引发FileNotFoundError [Errno2] No such file directory?

问题描述

我有一个部署在 Heroku 上的 django 博客应用程序,并从 AWS S3 Bucket 提供图像。当用户尝试上传图片时,我们使用 PIL 根据 if 条件缩略图调整尺寸大小(如下面的models.py所示)。

当我尝试更新个人资料图片时,它会抛出可怕的:

FileNotFoundError at /profile/

[Errno 2] No such file or directory: 'profile_pics/0umkn7tybif11.jpg'

错误的回溯还显示了这些关键行:

 /app/users/signals.py in save_profile

        instance.profile.save()

     ...

▶ Local vars
/app/users/models.py in save

                img.save(self.image.name)

     ...

▶ Local vars
/app/.heroku/python/lib/python3.6/site-packages/PIL/Image.py in save

                    fp = builtins.open(filename, "w+b")

     ...

▶ Local vars 

我的models.py文件似乎包含此错误中解决的代码:

from django.db import models
    from django.contrib.auth.models import User 
    from PIL import Image 
    from django.core.files.storage import default_storage as storage

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        image = models.ImageField(default='default.jpg', upload_to='profile_pics')

        def __str__(self):
            return f'{self.user.username} Profile'

        def save(self, **kwargs):
            super().save()

            img = Image.open(storage.open(self.image.name))

            if img.height > 300 or img.width > 300:
                output_size = (300, 300)
                img.thumbnail(output_size)
                img.save(self.image.name)

最后,如果我从 models.py 文件中删除以下代码,应用程序将正常运行:

if img.height > 300 or img.width > 300:
    output_size = (300, 300)
    img.thumbnail(output_size)
    img.save(self.image.name)

似乎 img.save(self.image.name) 没有正确访问 s3 存储桶路径?这是什么原因以及如何正确实施此缩略图大小调整。

标签: pythondjangoamazon-s3python-imaging-library

解决方案


推荐阅读