Il protocollo FTP è implementato dalla classe Net::FTP della libreria "net/ftp" che offre oltre ai comandi standard altre utili funzionalità.
require 'net/ftp'
ftp = Net::FTP.new('ftp.example.com')
ftp.login
ftp.chdir('pub/')
ftp.list('*') {|file| puts file}
ftp.gettextfile('README')
ftp.getbinaryfile('software.gz')
ftp.close
Apriamo la connessione passando l'indirizzo a new, poi effettuiamo il login, si noti che chiamando login senza argomenti si esegue un accesso anonimo, per accedere come utente vanno specificate le credenziali di accesso: username e password
ftp.login('admin', 'secret')
Dopodiché effettuaimo delle operazioni utilizzando i metodi chdir e list che eseguono gli omonimi comandi FTP. Infine utilizziamo entrambi i metodi get per scaricare un file di testo e un file binario; per caricare i file sul server vanno utilizzati i rispettivi metodi put: putbinaryfile e puttextfile.
In alternativa, per aprire una connessione, è possibile usare open con un blocco in questo modo:
Net::FTP.open('ftp.example.com') do |ftp|
ftp.login
ftp.list('*')
end
Nella prossima lezione esamineremo una libreria che rappresenta una valida alternativa a Net::HTTP e a Net::FTP.
open-uri
Essenzialmente la libreria open-uri estende il metodo open permettendo di passare come file da aprire una stringa contenente un URL HTTP o FTP. Inoltre sono applicabili all'oggetto restituito alcuni utili metodi e attributi che forniscono informazioni sulla richiesta effettuata aperta, come ad esempio charset, content_encoding, content_type, last_modified, base_uri, meta e status. Un esempio è il seguente:
require 'open-uri'
open('http://www.google.it') do |res|
res.meta.each {|k,v| puts "#{k}: #{v}"}
end
Il risultato sarà qualcosa del genere:
cache-control: private content-type: text/html; charset=ISO-8859-1 date: Mon, 13 Aug 2007 10:52:48 GMT server: gws transfer-encoding: chunked
L'attributo meta è un hash che rappresenta l'header. Invece per mostrare il contenuto della pagina si può utilizzare il metodo read oppure gets nel modo opportuno.