2009-12-18 93 views
2

我正在循環訪問外部網站託管的圖像的URL字符串數組。使用自定義圖像替換破碎的外部圖像

它看起來是這樣的:

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

將返回託管在外部網站上的圖片的網址。問題是,這些圖像中的一些可能會被打破(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" 

有沒有辦法解決這個問題的簡單方法?非常感謝提前。

回答

4

難道你不能做一個簡單的圖像請求,並檢查它的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狀態而不需要執行整個請求(請參閱上面鏈接的文檔中的請求方法以瞭解詳細信息)。

雖然希望有所幫助。

9

我不認爲有可能檢查遠程圖像的可用性沒有定期請求,皮特描述。

但可能是你找我用過一次(使用jQuery)有用的技巧:

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

在錯誤事件中,你可以替換圖像URL中的域名。

另外,您可以通過AJAX的帖子將這些信息從客戶端收集到您的主機,並在發生一些此類錯誤之後 - 使用Pete方法進行檢查。這將大大減少所需檢查的數量。

+0

我很欣賞這個輸入。不幸的是,這次我需要在服務器端完成所有這些工作,但是將來會考慮到這一點。 – btw 2009-12-18 20:39:36

+0

感謝一個很好的客戶端修復羅馬。將這個添加到工具箱,謝謝;) – 2009-12-21 11:24:45

+0

謝謝,漂亮的黑客 – Emmanuel 2012-12-18 16:56:39