File.basename(open(source_url))
non funzionerà perché open(source_url)
restituisce un handle di I/O di qualche ordina, non una stringa come File.basename
si aspetta.
File.basename(source_url)
avrebbe una migliore possibilità di lavoro, a meno che l'URL sta usando qualche codifica path/to/service/with/parameters/in/line/like/this
tipo.
La libreria URI di Ruby ha comunque utili strumenti per aiutare. Qualcosa di simile:
File.basename(URI.parse(source_url).path)
sarebbe un punto di partenza.Per esempio:
require 'uri'
File.basename(URI.parse('http://www.example.com/path/to/file/index.html').path
# => "index.html"
e:
File.basename(URI.parse('http://www.example.com/path/to/file/index.html?foo=bar').path)
# => "index.html"
sapete se posso prelevare la dimensione del file troppo e come?
Un ottimo modo per testare roba HTTP a livello locale, è quello di eseguire gem server
dalla riga di comando, e lasciare che le gemme fuoco su un piccolo server web per la sua documentazione:
require 'open-uri'
html_doc = open('http://0.0.0.0:8808/') do |io|
puts io.size
io.read
end
puts html_doc.size
# => 114350
# => 114350
Quando si utilizza un blocco con il comando open
di OpenURI, ti dà accesso a molte informazioni sulla connessione nella variabile di blocco, che è un'istanza della classe Tempfile
. Quindi, puoi scoprire la dimensione del file in arrivo usando size
.
che è ok per i file di piccole dimensioni, ma se si sta tirando in un file di grandi dimensioni si potrebbe desiderare di indagare con Net :: HTTP per inviare una richiesta di head
, che potrebbe includere la dimensione. Dico potrebbe, perché a volte il server non sa quanto verrà restituito, nel caso di contenuto dinamico, o il contenuto viene restituito da un CGI o sottoservizio che non si preoccupa di dire.
Il vantaggio di utilizzare una richiesta "testa" è che il server non restituisce l'intero contenuto, solo le intestazioni. Quindi, in passato, ho preimpostato una richiesta usando head
, per vedere se potevo ottenere i dati di cui avevo bisogno. In caso contrario, sarei costretto a inserire la risposta completa utilizzando un normale get
.
grazie, sai se posso recuperare anche il file e senza aspettare di ottenere tutto il file mb del file? – ElektroStudios
Guarda all'interno dell'intestazione Content-length. – Danyel