Проверка удаленного изображения на самом деле файл изображения в ruby? - PullRequest
10 голосов
/ 03 марта 2012

Я пытаюсь выяснить, как я могу проверить, что я подаю в несущую волну на самом деле изображение.Источник, из которого я получаю URL-адреса своих изображений, не возвращает мне все живые URL-адреса.Некоторые изображения больше не существуют.К сожалению, он на самом деле не возвращает правильные коды состояния или что-то еще, потому что я использовал какой-то код, чтобы проверить, существует ли удаленный файл, и проходил ли он эту проверку.Так что теперь, чтобы быть в безопасности, я хотел бы проверить, вернул ли я верный файл изображения, прежде чем я скачу его.

Вот код удаленной проверки файлов, который я использовал только для справки, но я бы предпочел что-то, что действительно может идентифицировать, что файлы являются изображениями.

require 'open-uri'
require 'net/http'

def remote_file_exists?(url)
    url = URI.parse(url)
    Net::HTTP.start(url.host, url.port) do |http|
      return http.head(url.request_uri).code == "200"
    end
end

Ответы [ 3 ]

10 голосов
/ 03 марта 2012

Я бы проверил, возвращает ли служба правильные типы пантомимы в HTTP-заголовке Content-Type.( вот список типов пантомимы )

Например, Content-Type домашней страницы StackOverflow - text/html; charset=utf-8, а Content-Type вашего граватарного изображения - image/png

Чтобы проверить заголовок Content-Type для image в ruby ​​с использованием Net :: HTTP, вы должны использовать следующее:

def remote_file_exists?(url)
    url = URI.parse(url)
    Net::HTTP.start(url.host, url.port) do |http|
      return http.head(url.request_uri)['Content-Type'].start_with? 'image'
    end
end
8 голосов
/ 15 января 2015

Ответ Рика Баттона работал для меня, но мне нужно было добавить поддержку SSl:

def self.remote_image_exists?(url)
  url = URI.parse(url)
  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = (url.scheme == "https")

  http.start do |http|
    return http.head(url.request_uri)['Content-Type'].start_with? 'image'
  end
end
4 голосов
/ 25 июля 2014

В итоге я использовал HTTParty для этого. Время ответа на запрос .net от Rick Button истекло.

  def remote_file_exists?(url)
    response = HTTParty.get(url)
    response.code == 200 && response.headers['Content-Type'].start_with? 'image'
  end

https://github.com/jnunemaker/httparty

...