2011-04-17 112 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小时