2011-11-10 18 views
0

ユーザーが画像をアップロードできるDjangoの管理者用設定があります。このシステムでは、JPEG形式の画像しか使用できません。アップロードされたすべての画像がJPEGSであることを確認する検証システムをまとめました。私のイメージモデルでは、私はのためのオーバーライドを持ってクリーン():Django admin:JPEGへの画像のアップロードを制限する

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()の実行中の一時ファイルの場所?

答えて

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') 
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): 
    ... 

私はジャンゴ1.3

内のすべてのそれをチェック
関連する問題