Если в URL нет имени файла, могу ли я определить, ведет ли он к изображению? - PullRequest
2 голосов
/ 11 октября 2010

Этот URL-адрес ведет вас к изображению, но не имеет расширения файла для проверки регулярного выражения:

http://www.tonymooreillustration.com/gallery/main.php?g2_view=core.DownloadItem&g2_itemId=393

Я использую Restclient (HTTP и REST клиент для Ruby) в моем приложении, поэтому я попытался сделать это:

RestClient.get "http://www.tonymooreillustration.com/gallery/main.php?g2_view=core.DownloadItem&g2_itemId=393"

Я получаю много текста, который начинается так:

"\377???JFIF\000\001\002\001\000H\000H\000\000\377?cExif\000\000MM\000*\000\000\000\b\000\a\001\022\000\003\000\000\000\001\000\001\000\000\001\032\000\005\000\000\000\001\000\000\000b\001\e\000\005\000\000\000\001\000\000\000j\001(\000\003\000\000\000\001\000\002\000\000\0011\000\002\000\000\000\024\000\000\000r\0012\000\002\000\000\000\024\000\000\000\206\207i\000\004\000\000\000\001\000\000\000\234\000\000\000?\000\000H\000\000\000\001\000\000\000H\000\000\000\001Adobe Photoshop 7.0\0002005:07:12 02:58:19\000\000\000\000\003\240\001\000\003\000\000\000\001\377\377\000\000\240\002\000\004\000\000\000\001\000\000\001?\000\004\000\000\000\001\000\000\002?\000\000\000\000\000\006\001\003\000\003\000\000\000

Есть ли способ, которым я могу использовать это, чтобы определить, указывает ли URL на изображение?

Ответы [ 5 ]

2 голосов
/ 11 октября 2010

Похоже, что ответ клиента REST оборачивает Net::HTTPResponse в Ruby, поэтому, если res является результатом RestClient.get, вы должны сделать:

res.net_http_res.header['content-type']

и посмотрите, начинается ли это с image/ например. image/jpeg для изображения JPEG.

Если вам на самом деле не нужна копия изображения и вам просто нужно проверить, на что указывает URL, тогда вам лучше выполнить запрос HEAD, как подсказывает reto . (это позволяет избежать получения ненужной копии содержимого тела.)

2 голосов
/ 11 октября 2010

Вы можете выполнить запрос HEAD и проверить заголовок на наличие информации MIME.

См .: http://ruby -doc.org / stdlib / libdoc / net / http / rdoc / classes / Net / HTTP.html # M000682

Ответ, который выполучить в своем примере само изображение.Вы также пытаетесь определить, является ли это изображение, используя утилиту, например file [1], или библиотеку изображений, например imagemagick [2].

[1] http://unixhelp.ed.ac.uk/CGI/man-cgi?file [2] http://rmagick.rubyforge.org/

1 голос
/ 11 октября 2010

Лучшей ставкой является заголовок Content-Type, но если ничего не помогает, вы можете получить формат изображения из начального набора байтов:

  • JPG: 0xFF 0xD8
  • PNG: 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A
  • GIF: 'G' 'I' 'F'

Найдите <format> file format, заменив <format> другими форматами файлов, которые вам нужно идентифицировать.

0 голосов
/ 31 марта 2011

Использовать FastImage - он соберет минимальные требуемые данные из URL, чтобы определить, является ли это изображение, тип изображения и размер.

0 голосов
/ 11 октября 2010

Я сделал это около 5 лет назад в php.К сожалению, у меня больше нет кода.В основном я использовал curl с возможностью следовать всем перенаправлениям.Таким образом, данные, которые возвращались в программу, почти всегда были тем, что я действительно хотел проверить.С этого момента я бы только взял первые несколько байтов данных из содержимого и проверил, существуют ли метаданные изображения и были ли они jpg, png или gif.Наличие кода, чтобы показать вам, вероятно, поможет объяснить это намного лучше, но его больше нет.Я сравнил это с «дегустацией» файла перед его употреблением.

Преимущество использования такого рода техники заключается в том, что вы на самом деле проверяете файл, а не полагаетесь на информацию заголовка, что обычно правильно, но не всегда.

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