Администратор Django: ограничение загрузки изображений в формат JPEG

#django #django-admin

#django #django-администратор

Вопрос:

У меня есть настройки администратора Django, где пользователи могут загружать изображения. Система допускает только изображения в формате JPEG. Я собрал систему проверки, чтобы проверить, что все загруженные изображения являются файлами JPEG. В моей модели изображений у меня есть переопределение для 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 ()?

Комментарии:

1. Вы также можете использовать (мой) пакет для проверки изображения.

Ответ №1:

Это не так надежно, как фактическая загрузка изображения с помощью 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')
  

Ответ №2:

при загрузке вы можете использовать:

 ...
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