【问题标题】:Django save fileDjango保存文件
【发布时间】:2011-08-18 13:12:30
【问题描述】:

我想为上传的图片创建缩略图。我知道有一些库可用,但我有非常基本的需求,我更愿意自己做。

我的模型是这样的:

from image_tools import resize

class Photo(models.Model):
    # some fields
    image = models.ImageField(
                upload_to='images',
                height_field='height',
                width_field='width'
            )
    thumb = models.ImageField(
        upload_to='thumbs',
        editable=False
    )

    def save(self):
        self.thumb = self.image
        resize(self.image.path, self.thumb.path, 50, 40)
        super(Photo, self).save()

resize() 是我编写的一个简单函数,它接受原始文件路径和目标路径以及尺寸作为参数并存储缩略图。唯一的问题是该文件此时尚未在磁盘上。

有没有办法强制将文件本身保存在它的位置,以便我的函数可以使用它?

请随时提出更好的方法来处理此问题。我仍然想知道如何处理尚未保存的文件,无论最好的解决方案是什么。

【问题讨论】:

    标签: django django-models thumbnails


    【解决方案1】:

    有几种方法可以做到这一点。如果您拥有原始图像数据,则可以很容易地将其写入文件(查找 django 文件上传以了解如何将上传的文件保存到磁盘)。您可以读取您的 django 进程(或 apache)可以访问的任何文件,而不仅仅是在您的 django 实例的路径中。

    在保存之前您可以做的另一件事是使用 PIL 对图像进行缩略图并保存:
    http://effbot.org/imagingbook/image.htm

    如果您希望图像托管在 CDN 上,您也可以使用 boto s3 将数据上传到 s3。

    【讨论】:

    • 我已阅读 django 文件上传,但我没有找到问题的答案。你能更具体一点吗? “一旦你有了原始图像数据,你就可以很容易地将它写入文件”正是我要问的问题。
    【解决方案2】:

    直接存储文件不是一个好主意,因为您忽略了默认文件存储(即文件系统、amazon s3、...)

    更好的方法是使用 django File 类

    from django.core.files import File
    # Create a Python file object using open() and the with statement
    >>> with open('/tmp/hello.world', 'w') as f:
    ...     myfile = File(f)
    ...     myfile.write('Hello World')
    

    还要删除文件使用默认存储类 有关详细信息,请参阅下面的链接 https://docs.djangoproject.com/en/1.5/topics/files/

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 2012-06-13
      • 1970-01-01
      • 2018-09-29
      • 2018-01-27
      • 2012-08-01
      • 2017-12-14
      • 2013-02-26
      • 2019-11-06
      相关资源
      最近更新 更多