【问题标题】:Change the uploaded image format in django在django中更改上传的图像格式
【发布时间】:2023-04-09 02:52:01
【问题描述】:

这是我在 Django 中用来上传和重命名图像文件的模型,

@deconstructible
class PathAndRename(object):
    def __init__(self, sub_path):
        self.path = sub_path

    def __call__(self, instance, filename):
        ext = filename.split('.')[-1]
        filename = '{}.{}'.format(uuid4().hex, ext)
        return os.path.join(self.path, filename)


class Diagram(models.Model):
    diagram = models.FileField(upload_to=PathAndRename("diagrams/"))
    text = models.CharField(max_length = 48)
    date = models.DateTimeField(auto_now_add=True, blank=True, null=True)

现在图像按照其原始格式同时保存为 .jpg 和 .png。

我的问题是如何进行所有上传,无论是 .jpg 文件还是 .png 文件以通用格式存储,例如.png 文件中的所有图像。

【问题讨论】:

标签: django django-models django-2.1


【解决方案1】:

我想我已经找到答案了,

 def __call__(self, instance, filename):
    png = "png"
    filename = '{}.{}'.format(uuid4().hex, png)
    return os.path.join(self.path, filename)

【讨论】:

    【解决方案2】:

    我会为此使用 django 信号,如下所示:

    from Pil import Image
    import os
    @receiver(post_save, sender=Diagram)
    def image_to_png(sender, instance, **kwargs):
        if kwargs.get('created') and instance.diagram:
            filename, file_ext = os.path.splitext(instance.diagram.path)
            if file_ext != ".png":
                im = Image.open(instance.diagram.path)
                im.save(instance.diagram.path.replace(file_ext, ".png")
    

    如果您想检查每个更新,只需删除创建的验证即可。

    【讨论】:

    • 没有用。 @post_save 给出错误,所以我将其更改为 @receiver(post_save, sender=Diagram)。但是上传后图片在.jpg中。
    • 你确定信号被触发了吗?你可以打印出来检查一下。
    • 我已经找到了答案,在def __call__。我也会尝试你的答案,并会让你知道。谢谢。
    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2013-04-22
    • 2023-01-18
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多