Тест Python для URL и типа изображения - PullRequest
4 голосов
/ 13 сентября 2010

В следующем коде, как проверить, является ли тип URL-адрес или тип изображения

for dictionaries in d_dict:
  type  = dictionaries.get('type')
  if (type starts with http or https):
    logging.debug("type is url")
  else if type ends with .jpg or .png or .gif
    logging.debug("type is image")
  else:
     logging.debug("invalid type") 

Ответы [ 4 ]

15 голосов
/ 13 сентября 2010

Вы не можете определить, к какому типу относится ресурс, исключительно по его 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.)

3 голосов
/ 06 августа 2015

Я написал на основе предыдущих комментариев скрипт на python, который сначала проверяет каждый HEAD-запрос для content_type и, если это не удается для mimetype.Надеюсь, это поможет.

    import mimetypes
    import urllib2


    class HeadRequest(urllib2.Request):
        def get_method(self):
            return 'HEAD'

    def get_contenttype(image_url):
        try:
            response= urllib2.urlopen(HeadRequest(image_url))
            maintype= response.headers['Content-Type'].split(';')[0].lower()
            return maintype
        except urllib2.HTTPError as e:
            print(e)
            return None

    def get_mimetype(image_url):
        (mimetype, encoding) =  mimetypes.guess_type(image_url)
        return mimetype

    def get_extension_from_type(type_string):
        if type(type_string) == str or type(type_string) == unicode:
            temp = type_string.split('/')
            if len(temp) >= 2:
                return temp[1]
            elif len(temp) >= 1:
                return temp[0]
            else:
                return None

    def get_type(image_url):
        valid_types = ('image/png', 'image/jpeg', 'image/gif', 'image/jpg')
        content_type = get_contenttype(image_url)
        if content_type in valid_types:
            return get_extension_from_type(content_type)
        mimetypes = get_mimetype(image_url)
        if mimetypes in valid_types:
            return get_extension_from_type(mimetypes)
        return None
3 голосов
/ 13 сентября 2010

Используйте регулярные выражения.

import re

r_url = re.compile(r"^https?:")
r_image = re.compile(r".*\.(jpg|png|gif)$")

for dictionaries in d_dict:
  type  = dictionaries.get('type')
  if r_url.match(type):
    logging.debug("type is url")
  else if r_image.match(type)
    logging.debug("type is image")
  else:
     logging.debug("invalid type") 

Два замечания: type является встроенным, и изображения могут быть загружены также с URL.

0 голосов
/ 14 сентября 2010

Если вы собираетесь угадать тип ресурса по его URL, то я предлагаю вам использовать библиотеку mimetypes . Поймите, однако, что таким образом вы можете только догадываться об образовании.

Как предполагает bobince, вы также можете сделать запрос HEAD и использовать заголовок Content-Type. Это, однако, предполагает, что сервер настроен (или, в случае веб-приложения, запрограммирован) для возврата правильного Content-Type. Это не может быть.

Таким образом, единственный способ действительно рассказать - это загрузить файл и использовать что-то вроде libmagic (хотя это возможно, даже если это может произойти сбой). Если вы решите, что такой уровень точности необходим, вас может заинтересовать это python-связывание для libmagic .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...