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

Jae*_*Jae 5 python url http

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

小智 12

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

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
Run Code Online (Sandbox Code Playgroud)

  • 对于两个不同的 URL,一个是图像,一个是非图像,`r.headers["content-type"]` = "text/html; charset=iso-8859-1"。即该函数无论如何都返回 False。深入探究,原因似乎是我的“图像”URL实际上重定向到图像存在的新URL,这在浏览器和下载时是无缝的,但如果您手动跟踪重定向,标头只会以图像形式返回找到图像“真正”所在的“最终”URL。使用该 URL,例程返回 True。所以......请谨慎使用此例程:它返回 False 的次数可能不止一个可能需要的。 (2认同)

Mat*_*odd 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:
        return False

def is_image_and_ready(url):
    return is_url_image(url) and check_url(url)
Run Code Online (Sandbox Code Playgroud)