Вы не можете определить, к какому типу относится ресурс, исключительно по его URL.Вполне допустимо иметь GIF-файл по URL-адресу без расширения .gif
или с вводящим в заблуждение расширением, таким как .txt
.На самом деле, вполне вероятно, что теперь, когда перезапись URL-адресов популярна, вы получите URL-адреса изображений вообще без расширения файла.
Это заголовок ответа Content-Type
HTTP, который определяет тип ресурсав Интернете есть, поэтому единственный способ узнать наверняка - это получить ресурс и посмотреть, какой ответ вы получите.Вы можете сделать это, посмотрев на заголовки, возвращаемые urllib.urlopen(url).headers
, но это на самом деле извлекает сам файл.Для эффективности вы можете предпочесть сделать запрос HEAD, который не передает весь файл:
import urllib2
class HeadRequest(urllib2.Request):
def get_method(self):
return 'HEAD'
response= urllib2.urlopen(HeadRequest(url))
maintype= response.headers['Content-Type'].split(';')[0].lower()
if maintype not in ('image/png', 'image/jpeg', 'image/gif'):
logging.debug('invalid type')
Если вам нужно попытаться прослушать тип, основываясь на расширении файла в части пути URL (например, потому что вы неу вас нет сетевого соединения), вы должны сначала проанализировать URL с помощью urlparse
, чтобы удалить любую часть ?query
или #fragment
, чтобы http://www.example.com/image.png?blah=blah&foo=.txt
не перепутал ее.Также вам следует рассмотреть возможность использования mimetypes
для сопоставления имени файла с Content-Type, чтобы вы могли воспользоваться его знанием расширений файлов:
import urlparse, mimetypes
maintype= mimetypes.guess_type(urlparse.urlparse(url).path)[0]
if maintype not in ('image/png', 'image/jpeg', 'image/gif'):
logging.debug('invalid type')
(например, чтобыразрешены также альтернативные расширения. По крайней мере, вы должны разрешить .jpeg
для image/jpeg
файлов, а также мутантный трехбуквенный вариант Windows .jpg
.)