這似乎是一個相當容易的問題,但我無法弄清楚這裏發生了什麼。 基本上,我想要做的是在Django模型上從一個圖像創建兩個不同的縮略圖。最終發生的事情是它似乎在循環並重新創建相同的圖像(每次向它附加一個下劃線),直到它引發一個文件名很大的錯誤。所以,你最終是這樣的:從Django中的相同圖像生成兩個縮略圖
OSError: [Errno 36] File name too long: 'someimg________________etc.jpg'
這裏是代碼(保存方法是對藝術家模型):
def save(self, *args, **kwargs):
if self.image:
iname = os.path.split(self.image.name)[-1]
fname, ext = os.path.splitext(iname)
tlname, tsname = fname + '_thumb_l' + ext, fname + '_thumb_s' + ext
self.thumb_large.save(tlname, make_thumb(self.image, size=(250,250)))
self.thumb_small.save(tsname, make_thumb(self.image, size=(100,100)))
super(Artist, self).save(*args, **kwargs)
def make_thumb(infile, size=(100,100)):
infile.seek(0)
image = Image.open(infile)
if image.mode not in ('L', 'RGB'):
image.convert('RGB')
image.thumbnail(size, Image.ANTIALIAS)
temp = StringIO()
image.save(temp, 'png')
return ContentFile(temp.getvalue())
我沒有表現出對進口爲了簡潔起見。假設Artist模型上有兩個ImageField:thumb_large和thumb_small。
我測試,如果這個工程的方式是,在shell:
artist = Artist.objects.get(id=1)
artist.save()
#error here after a little wait (until I assume it generates enough images that the OSError gets raised)
如果不這樣做的正確的方式,我會很感激的任何反饋。謝謝!
假設'保存()'正在從Django模塊調用時,它是很難在不調用代碼來回答,或藝術家的定義.save,或ContentFile等 – msw 2010-03-15 02:25:03
我把它的方式是,在shell: 藝術家= Artist.objects.get(ID = 1) artist.save() 那是怎樣我一直在測試如果它有效,藝術家就會有一個形象。所以如果self.image是真的。 這是在Artist模型上定義的保存方法,與ContentFile一樣:從django.core.files.base導入ContentFile – tsoporan 2010-03-15 02:45:14