Замена сломанных внешних изображений на пользовательские изображения - PullRequest
2 голосов
/ 18 декабря 2009

Я перебираю массив строк URL-адресов изображений, размещенных на внешнем сайте.

Это выглядит примерно так:

def get_image_urls
  image_url_array.each do |image_url|
    puts image_tag image_url
  end
end

, который будет возвращать URL-адреса изображений, размещенных на внешнем сайте. Проблема в том, что некоторые из этих изображений могут быть повреждены (404). Так, например:

get_image_urls
# These would return image_tags, but for brevity...
=> "http://someothersite.com/images/1.jpg"
   "http://someothersite.com/images/2.jpg"
   "http://someothersite.com/images/3.jpg" # <-- (Broken: 404)
   "http://someothersite.com/images/4.jpg"
   "http://someothersite.com/images/5.jpg" # <-- (Broken: 404)

Что я хочу сделать, так это заменить строки URL поврежденных изображений на «отсутствующие» изображения, размещенные на моем сайте. Таким образом, используя приведенный выше пример с поврежденными 3.jpg и 5.jpg, я хочу получить что-то вроде этого:

get_image_urls
# These would return image_tags, but for brevity...
=> "http://someothersite.com/images/1.jpg"
   "http://someothersite.com/images/2.jpg"
   "http://mysite.com/images/missing.png"
   "http://someothersite.com/images/4.jpg"
   "http://mysite.com/images/missing.png"

Есть ли простой способ решить эту проблему? Большое спасибо заранее.

Ответы [ 2 ]

10 голосов
/ 18 декабря 2009

Я не думаю, что можно проверить доступность удаленных изображений без периодических запросов, как описал Пит.

Но, может быть, вы найдете полезный трюк, который я использовал однажды (с помощью jquery):

$('img').error(function(){
 $(this).attr('src', '<<<REPLACE URL>>>');
});

В случае ошибки вы можете заменить хост на URL изображения.

Кроме того, вы можете собирать эту информацию посредством сообщений AJAX на ваш хост от клиента и после некоторого количества таких ошибок - проверять методом Пита. Это радикально уменьшит количество необходимых проверок.

4 голосов
/ 18 декабря 2009

Не могли бы вы сделать простой запрос на изображение и проверить, если это 404? Это не идеально, но поймать большую часть. Зависит от того, как часто вы его запускаете. Если у вас нет доступа к файлам на сервере напрямую для проверки, то HTTP-запрос является единственным способом. Для скорости вы можете сделать только заголовок запроса. Нужен пример кода, позвольте мне выкопать один из них ...

Зависит от того, что вернет ваш сервер. Если вы можете получить заголовки и просто получите стандартную страницу 404, то вы можете проверить длину содержимого, чтобы убедиться, что он недостаточно велик для изображения, что звучит немного странно, но работать (есть лучший способ потом). Что-то вроде:

(взять и изменить с http://ruby -doc.org / stdlib / libdoc / net / http / rdoc / classes / Net / HTTP.html # M000682 ).

response = nil
Net::HTTP.start('www.example.com', 80) {|http|
  response = http.head('/myimage.html')
}
# Assume anything with a content-length greater than 1000 must be an image? 
# You will need to tweek/tune this to your server and your definition of what a good image is
p "Good image" unless response['content-length'] < 1000

В качестве альтернативы вы можете (и должны действительно делать это правильно) получить сообщение о статусе HTTP, так как именно так сервер сообщает вам, есть изображение или нет. Единственная проблема заключается в том, что вам, возможно, придется загрузить все это, поскольку я не знаю быстрого способа получить только HTTP-статус без выполнения всего запроса (подробности см. В методе запроса в документе, указанном выше).

Надеюсь, это поможет.

...