以下代码在保存后拍摄图像并从中制作缩略图:
class Image(models.Model):
image = models.ImageField(upload_to='images')
thumbnail = models.ImageField(upload_to='images/thumbnails', editable=False)
def save(self, *args, **kwargs):
super(Image, self).save(*args, **kwargs)
if self.image:
from PIL import Image as ImageObj
from cStringIO import StringIO
from django.core.files.uploadedfile import SimpleUploadedFile
try:
# thumbnail
THUMBNAIL_SIZE = (160, 160) # dimensions
image = ImageObj.open(self.image)
# Convert to RGB if necessary
if image.mode not in ('L', 'RGB'): image = image.convert('RGB')
# create a thumbnail + use antialiasing for a smoother thumbnail
image.thumbnail(THUMBNAIL_SIZE, ImageObj.ANTIALIAS)
# fetch image into memory
temp_handle = StringIO()
image.save(temp_handle, 'png')
temp_handle.seek(0)
# save it
file_name, file_ext = os.path.splitext(self.image.name.rpartition('/')[-1])
suf = SimpleUploadedFile(file_name + file_ext, temp_handle.read(), content_type='image/png')
self.thumbnail.save(file_name + '.png', suf, save=False)
except ImportError:
pass
它工作正常,原始图像+缩略图都被上传,图像被分配了正确的路径。
唯一的问题是缩略图没有被分配新创建的缩略图的路径 - 它在数据库中是空的。我已经阅读了文档,看起来如果我用save = True保存缩略图它应该解决我的问题:
self.thumbnail.save(file_name + '.png', suf, save=True)
但是,这样做会引发以下情况:
Django Version: 1.3.1
Exception Type: IOError
Exception Value:
cannot identify image file
我无法弄清楚我做错了什么。
答案 0 :(得分:6)
我只是通过移动解决了我的问题:
super(Image, self).save(*args, **kwargs)
到def save()的结尾。我仍然不确定为什么会这样,但我唯一的解释是save()本身是将字段值保存到数据库中,因此需要在最后执行。
答案 1 :(得分:2)
尝试传递实际文件内容而不是SimpleUploadedFile对象:
self.thumbnail.save(file_name + '.png', temp_handle.read(), save=True)
https://docs.djangoproject.com/en/dev/ref/files/file/#additional-methods-on-files-attached-to-objects how to manually assign imagefield in Django Programmatically saving image to Django ImageField