2013-04-18 17 views
17

Ho bisogno di scrivere il codice che determinerà se un file esiste controllando il suo URL.Come faccio a verificare se un file esiste usando il suo URL senza scaricarlo?

Attualmente mi attuare questo:

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

Ma, non funziona proprio perché ogni volta che si scarica il file, che è molto lento se ho file di grandi dimensioni o un sacco di loro.

Come determinare se esiste un file sul lato remoto senza scaricarlo?

+0

Hai accesso al codice lato server? Puoi cambiare i controller? – shishirmk

+5

Non terminare le righe con ';'. Questo non è C o Perl. –

+0

Vedere [Verbi HTTP] (http://en.wikipedia.org/wiki/HTTP_Verbs#Request_methods), in particolare il metodo 'HEAD'. Se conosci meglio i verbi, troverai più facile trovare un modo per fare cose come questa, indipendentemente dalla biblioteca. – iain

risposta

28

Se si desidera utilizzare Net :: HTTP allora si può fare in questo modo:

uri = URI(url) 

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

Vale la pena sottolineare che 'Net :: HTTP' è incluso nello stand Ruby spec. – bdares

+0

essere a conoscenza di altri codici di risposta validi, ad esempio 301, il file può effettivamente essere lì, nel prossimo url da recuperare dalla prima richiesta. i.e: tinyurl – fabriciofreitag

4

fare qualcosa di simile

require "rest-client" 

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

Poi "esiste" è un valore booleano a seconda del tipo, se esiste o no. Ciò otterrà solo le informazioni dell'intestazione, non il file, quindi dovrebbe essere lo stesso per i file piccoli o grandi.

+0

Questo è buono, ma non voglio usare ulteriori gemme o lib per quello – Ph0en1x

+0

Capito, sfortunatamente non sono sicuro di un modo per farlo senza usare qualcosa come rest-client. In bocca al lupo! – JoshEmory

2

mi piacerebbe scrivere in questo modo:

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 

quali uscite true perché ho avuto un 302 per il response.code.

+0

Provo a fare le cose in questo modo, ma mi lancia un'eccezione host sconosciuta – Ph0en1x

+1

Non riesco a duplicarlo. Funziona per me usando Ruby 1.9.3. Non mostri l'URL che stai cercando di raggiungere, quindi è impossibile per noi aiutarti in questo. –

Problemi correlati