【问题标题】:Django - saving over ImageFile appends upload path to filenameDjango - 通过 ImageFile 保存将上传路径附加到文件名
【发布时间】:2020-11-23 13:52:24
【问题描述】:

我正在尝试调整ImageField 图像的大小并覆盖现有文件。我正在使用 Django 3.1.2 和 Pillow 8.0.0。当我保存更新的图像时,它的 upload_to 路径似乎将 prepended 到现有文件路径。我不知道它为什么这样做,我希望它停止。

字段定义为:

hero_image = models.ImageField(blank=True, null=True, upload_to="images/articles/hero")

这是一个可重现的例子:

from my_app.models import Article
from PIL import Image, ImageOps
from six import BytesIO

# load an Article
article=Article.objects.get(id=6019)

# get its image
article.hero_image
> <ImageFieldFile: images/articles/hero/park_lake_5.jpg>

# open the image 
image_file = Image.open(article.hero_image)

# resize the image 
image_file_fit = ImageOps.fit(image_file, (100,100), method=Image.LANCZOS)

# create a stream
image_content = BytesIO()

# save updated image to stream
image_file_fit.save(image_content, format="JPEG", quality=80)

# create a new image file from the stream
new_image_content = ImageFile(image_content)

# save the new image content into the existing image field
article.hero_image.save(article.hero_image.name, new_image_content)

# inspect the updated image
article.hero_image
<ImageFieldFile: images/articles/hero/images/articles/hero/park_lake_5.jpg

发生了什么事?我做错了什么?

【问题讨论】:

  • save 调用 generate_fieldname 前面加上 upload_to。不确定更新图像的更好方法是什么。你不能把它分配给article.hero_image,比如article.hero_image = new_image_content吗?

标签: django python-imaging-library


【解决方案1】:

我仍然不知道它为什么这样做,但我最终通过简单地在保存调用中调用 basename 来解决它,例如:

article.hero_image.save(basename(article.hero_image.name), new_image_content)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 2010-12-31
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2018-02-22
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多