ヘイ、私は2つの画像を保存するモデルを持っています
class Picture(models.Model):
picture = models.ImageField(upload_to=make_filename)
thumbnail = models.ImageField(upload_to=make_thumb_filename)
car = models.ForeignKey('Car')
created_on = models.DateField(auto_now_add=True)
updated_on = models.DateField(auto_now=True)
def save(self):
super(Picture, self).save()
size = 200, 200
filename = str(self.thumbnail.path)
image = Image.open(filename)
image.thumbnail(size, Image.ANTIALIAS)
image.save(filename)
ご覧のとおり、save() メソッドを上書きしました。私の見解では、IOErrors (画像以外のファイルがアップロードされた場合に発生する) をチェックするブロックを除いて、簡単な試行があります。
def upload(request):
car = Car.objects.get(pk=1)
try:
picture = Picture(picture=request.FILES['image'], thumbnail=request.FILES['image'], car=car)
picture.save()
except IOError:
return HttpResponseRedirect("/test/")
ただし、例外は発生しますが、ファイルは引き続きサーバー (および db) に書き込まれます。
IOError が発生した場合にファイルが書き込まれないようにする方法はありますか?
編集
カスタムメソッドを書くことで修正
def is_accectable_file(filename):
extension = filename.split('.')[-1]
acceptable_filetypes = ['jpeg','jpeg','gif','png']
if extension in acceptable_filetypes:
return True
else:
return False
次に、モデルを終了して
class Picture(models.Model):
picture = models.ImageField(upload_to=make_filename)
thumbnail = models.ImageField(upload_to=make_thumb_filename)
car = models.ForeignKey('Car')
created_on = models.DateField(auto_now_add=True)
updated_on = models.DateField(auto_now=True)
def save(self, *args, **kwargs):
if is_accectable_file(self.picture.name):
super(Picture, self).save(*args,**kwargs)
size = 200, 200
filename = str(self.thumbnail.path)
image = Image.open(filename)
image.thumbnail(size, Image.ANTIALIAS)
image.save(filename)
return True
else:
return False
そして私の見解
def upload(request):
car = Car.objects.get(pk=1)
try:
picture = Picture(picture=request.FILES['image'], thumbnail=request.FILES['image'], car=car)
if picture.save():
return HttpResponse("fine")
else:
return HttpResponse("invalid type")
except:
return HttpResponse("no file")