Django admin:限制图像上传到JPEG

时间:2011-11-10 16:32:22

标签: django django-admin

我有一个Django管理员设置,用户可以上传图像。系统仅允许JPEG格式的图像。我整理了一个验证系统来检查所有上传的图像都是JPEGS。在我的Images模型中,我有一个覆盖clean():

class Image(models.Model):
    image = models.ImageField(upload_to="images/", blank=True, null=True, help_text='JPEG images only', max_length=100)
    ...
    def clean(self):
        import Image

        if "images/" in str( self.image ):
            i = Image.open( "%s/%s" % ( settings.MEDIA_ROOT, self.image ) )

            if i.format != "JPEG":
                raise validators.ValidationError, u'You can only upload JPEG images'

问题是,只有在上传图像并重新保存记录后才能找到图像。如果它是第一次创建的,则在将图像保存到媒体文件夹之前将调用clean()函数。

是否有一个我可以覆盖的功能,它可以引发一个问题,即在保存记录之前以错误的格式上传文件,但是在文件至少存储之后或是否有找到文件的方法执行clean()时的临时文件位置?

2 个答案:

答案 0 :(得分:0)

这并不像实际使用PIL加载图像并检查其格式那样简单,但该字段具有name属性,您可以在清理模型时检查该属性。

import re
p = re.compile(r'.*\.(jpg|jpeg)$', re.I)
filename = self.your_file_field.name
if not p.match(filename):
    raise ValidationError('You must upload a JPEG image')

答案 1 :(得分:0)

在上传中您可以使用:

...
import Image
from cStringIO import StringIO

self.image.open()
i = Image.open(StringIO(self.image.file.read())
...

检查文件是否已上传:

from django.core.files.uploadedfile import InMemoryUploadedFile
if isinstance(self.image.file, InMemoryUploadedFile):
   ...

我在django 1.3中检查所有内容