2011-04-17 61 views
2

我在一個視圖下面的代碼:保存圖像,並檢查是否it's圖像

from django.core.files.temp import NamedTemporaryFile 

... 

image_url = request.POST['url'] 
name = urlparse(image_url).path.split('/')[-1] 
picture = Picture() 
picture.user = request.user  
img_temp = NamedTemporaryFile(delete=True) 
img_temp.write(urllib2.urlopen(image_url).read()) 
img_temp.flush() 
picture.picture.save(name, File(img_temp)) 
picture.save() 

,工作正常,但我想,以確保「img_temp」實際上是一個是圖片。我怎樣才能做到這一點?

編輯:

從來就找到了解決辦法。 Theres中的一個模塊叫做imghdr,它對文件進行字節級別的驗證,看它們是否爲圖像。它可以這樣使用:

from django.core.files.temp import NamedTemporaryFile 
import imghdr 

    image_url = request.POST['url'] 
    name = urlparse(image_url).path.split('/')[-1] 
    picture = Picture() 
    picture.user = request.user  
    img_temp = NamedTemporaryFile(delete=True) 
    img_temp.write(urllib2.urlopen(image_url).read()) 
    img_temp.flush()   
    to_save = File(img_temp) 
    to_save.open() 
    extension = imghdr.what(to_save) 
    if not extension in ['jpg', 'jpeg', 'png', 'gif']: 
     to_save.close() 
     return None 
    picture.picture.save(name, to_save) 
    foto.save() 

請讓我知道如果你看到這段代碼中的任何錯誤。

回答

-1

爲什麼你只是驗證,看看image_url是一個圖像?

+0

因爲那只是一個字符串。人們可以通過追加'.jpg' – fceruti 2011-04-17 03:23:01

+0

耶存儲惡意腳本。但是,有人可以將帶有.jpg擴展名的垃圾文件。 您需要使用PIL進行驗證。 – A3R 2011-04-17 07:47:03

0
img_temp = NamedTemporaryFile(delete=True) 

- >它不會在Django 1.3工作,而是使用:

img_temp = NamedTemporaryFile() 

這行代碼浪費我2小時