我想为上传的图片创建缩略图。我知道有一些库可用,但我有非常基本的需求,我宁愿自己这样做。
我的模型是这样的:
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()
是我编写的一个简单函数,它接受原始文件路径和目标路径以及尺寸并存储缩略图作为参数。唯一的问题是此时该文件尚未存在于磁盘上。
有没有办法强制将文件本身保存在其位置,以便它可以用于我的函数?
请随意提出更好的方法来处理此事。我仍然想知道如何处理尚未保存的文件,无论最佳解决方案是什么。
答案 0 :(得分:1)
有几种方法可以做到这一点。一个你有原始图像数据,你可以很容易地将它写入文件(查找django文件上传,看看如何将上传的文件保存到磁盘)。您可以读取django进程(或apache)可以访问的任何文件,而不仅仅是在django实例的路径中。
在保存之前你可以做的另一件事是使用PIL缩放图像并保存它:
http://effbot.org/imagingbook/image.htm
如果您想要托管在CDN上的图像,您也可以使用boto s3将数据上传到s3。
答案 1 :(得分:1)
直接存储文件不是一个好主意,因为您忽略了默认文件存储(即文件系统,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/