我正在制作一个网站。我想从服务器检查用户提交的链接是否确实是存在的图像。
这是最适合我的应用程序的方法,也基于之前的评论:
import requests
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
这是一种快速的方法:
它并没有真正验证是否真的是图像文件,它只是根据文件扩展名进行猜测,然后检查 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)
您可以读取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")
您还可以获取其他信息,例如图像的大小等。好消息是它不会下载图像。如果标头说它是图像而实际上不是,则可能会失败,但如果图像通过第一个过滤器,您仍然可以进行最后检查并下载图像。
看看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”。如果它不是图像,它将返回 None
希望有帮助!
-布莱克