检查图像的URL是否已启动并且是否存在于Python中

时间:2012-05-11 00:36:35

标签: python http url

我正在建立一个网站。我想从服务器检查用户提交的链接是否实际上是一个存在的图像。

4 个答案:

答案 0 :(得分:10)

这是一种快速的方式:

它并没有真正验证它是否真的是一个图像文件,它只是基于文件扩展而猜测,然后检查该url是否存在。如果您确实需要验证从url返回的数据实际上是一个图像(出于安全原因),那么此解决方案将无法正常工作。

import mimetypes, urllib2

def is_url_image(url):    
    mimetype,encoding = mimetypes.guess_type(url)
    return (mimetype and mimetype.startswith('image'))

def check_url(url):
    """Returns True if the url returns a response code between 200-300,
       otherwise return False.
    """
    try:
        headers={
            "Range": "bytes=0-10",
            "User-Agent": "MyTestAgent",
            "Accept":"*/*"
        }

        req = urllib2.Request(url, headers=headers)
        response = urllib2.urlopen(req)
        return response.code in range(200, 209)
    except Exception, ex:
        return False

def is_image_and_ready(url):
    return is_url_image(url) and check_url(url)

答案 1 :(得分:2)

根据之前的评论,这是适用于我的应用程序的最佳方法:

def is_url_image(image_url):
   image_formats = ("image/png", "image/jpeg", "image/jpg")
   r = requests.head(image_url)
   if r.headers["content-type"] in image_formats:
      return True
   return False

答案 2 :(得分:1)

查看imghdr

以下是一些示例代码:

import imghdr
import httplib
import cStringIO

conn = httplib.HTTPConnection('www.ovguide.com', timeout=60)
path = '/img/global/ovg_logo.png'
conn.request('GET', path)
r1 = conn.getresponse()

image_file_obj = cStringIO.StringIO(r1.read())
what_type = imghdr.what(image_file_obj)

print what_type

这应该返回'png'。如果它不是图像,则返回无

希望有所帮助!

-Blake

答案 3 :(得分:0)

您可以阅读http请求的标头,它包含一些元数据,如内容类型。

在python 3上:

from urllib.request import urlopen
image_formats = ("image/png", "image/jpeg", "image/gif")
url = "http://localhost/img.png"
site = urlopen(url)
meta = site.info()  # get header of the http request
if meta["content-type"] in image_formats:  # check if the content-type is a image
    print("it is an image")

您还可以获得其他信息,例如图片的大小等。有关这方面的好消息是它不会下载图像。如果标题表示它是图像而它不是,则可能会失败,但如果图像通过第一个过滤器,您仍然可以进行最后检查并下载图像。