2013-04-18 8 views
17

Potrzebuję napisać kod, który określi, czy plik istnieje, zaznaczając jego URL.Jak sprawdzić, czy plik istnieje, używając jego adresu URL bez pobierania?

Obecnie zaimplementować to:

error_code = 400; 
response = Net::HTTP.get_response(URI(url)); 
return response.code.to_i < error_code; 

Ale to nie działa prawo, ponieważ za każdym razem pobiera plik, który jest bardzo powolny, jeśli mam duże pliki lub wiele z nich.

Jak ustalić, czy plik istnieje po stronie zdalnej, nie pobierając go?

+0

Czy masz dostęp do kodu po stronie serwera? Czy możesz zmienić kontrolery? – shishirmk

+5

Nie kończ linii w ';'. To nie jest C ani Perl. –

+0

Zobacz [HTTP verbs] (http://en.wikipedia.org/wiki/HTTP_Verbs#Request_methods), w szczególności metodę 'HEAD'. Jeśli znasz czasowniki lepiej, łatwiej znajdziesz sposób na zrobienie takich rzeczy, niezależnie od biblioteki. – iain

Odpowiedz

28

Jeśli chcesz użyć Net :: HTTP następnie można zrobić to w ten sposób:

uri = URI(url) 

request = Net::HTTP.new uri.host 
response= request.request_head uri.path 
return response.code.to_i == 200 
+2

Warto zauważyć, że 'Net :: HTTP' jest zawarty w specyfikacji Ruby spec. – bdares

+0

należy pamiętać o innych ważnych kodach odpowiedzi, na przykład 301, plik rzeczywiście może tam być, w następnym adresie URL do pobrania z pierwszego żądania. tj .: tinyurl – fabriciofreitag

4

zrobić coś takiego

require "rest-client" 

begin 
    exists = RestClient.head("http://google.com").code == 200 
rescue RestClient::Exception => error 
    exists = (error.http_code != 404) 
end 

Potem „istnieje” jest logiczną zależnie czy jeśli istnieje, czy nie. Otrzyma to tylko informacje o nagłówku, a nie plik, więc powinno być takie samo dla małych lub dużych plików.

+0

To dobrze, ale nie chcę używać dodatkowych klejnoty lub biblioteki do tego – Ph0en1x

+0

Zrozumiałem, niestety nie jestem pewien, jak to zrobić bez użycia czegoś takiego jak klient-klient. Powodzenia! – JoshEmory

2

że piszę to w ten sposób:

require 'net/http' 

ERROR_CODE = 400 

response = Net::HTTP.start('www.example.net', 80) do |http| 
    http.request_head('/index.html') 
end 

puts response.code.to_i < ERROR_CODE 

które wyjścia true bo dostał 302 dla response.code.

+0

Próbuję robić rzeczy w ten sposób, ale wyrzuca mi nieznany wyjątek hosta – Ph0en1x

+1

Nie mogę tego powielić. Działa to dla mnie przy użyciu Ruby 1.9.3. Nie pokazujesz adresu URL, do którego próbujesz dotrzeć, więc nie jesteśmy w stanie Ci w tym pomóc. –

Powiązane problemy