【问题标题】:Save image from url in django and checking if it´s an image从 django 中的 url 保存图像并检查它是否是图像
【发布时间】:2011-04-17 02:55:27
【问题描述】:

我在一个视图中有以下代码:

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”实际上是一个图像。我怎样才能做到这一点?

编辑:

我找到了解决方案。 python中有一个名为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()

如果您在此代码中发现任何错误,请告诉我。

【问题讨论】:

    标签: django django-views


    【解决方案1】:
    img_temp = NamedTemporaryFile(delete=True)
    

    --> 它在 Django 1.3 中不起作用,而是使用:

    img_temp = NamedTemporaryFile()
    

    这行代码浪费了我2个小时

    【讨论】:

      【解决方案2】:

      您为什么不验证image_url 是否为图像?

      【讨论】:

      • 因为那只是一个字符串。人们可以通过附加'.jpg'来保存恶意脚本
      • 是的。但是,有人可以放置一个带有 .jpg 扩展名的垃圾文件。您需要使用 PIL 进行验证。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2012-06-30
      • 2010-11-24
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多