Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
In questo esempio vedremo come uploadare o downloadare un file su un server remoto tramite FTP. L'esempio sfrutterà il controllo Inet; pertanto dall'elenco componenti (CTRL+T) del menu Progetto selezioneremo il controllo Microsoft Internet Transfer Control, detto anche Inet Control .
Se vogliamo uploadare un file sul nostro sito per poterlo mettere on line o per renderlo disponibile a terzi, oppure vogliamo scaricare un file da uno spazio FTP pubblico o del quale conosciamo la password, abbiamo due possibilità. Se siamo degli smanettoni e ci piacciono le finestre testuali in stile xterm (un terminale testuale), apriamo il prompt di MS-DOSe cominciamo a digitare i comandi del protocollo FTP. Se invece non abbiamo dimestichezza con comandi strani che non conosciamo
e vogliamo comodamente premere due o tre pulsanti per completare la nostra
operazione, usiamo il nostro client FTP preferito (io personalmente uso
sia il prompt del DOS che il programma WS_FTP). Cerchiamo di capire quindi cosa sta dietro la negoziazione di una sessione FTP. Tutti gli ISP (Internet Service Provider) dovrebbero dare uno spazio seppur esiguo. Se non siete a conoscenza di un host con servizio FTP potreste provare ad implementare uno scanner che tenti delle connessioni con utente anonymous seguendo il tutorial sulla programmazione del Winsock già pubblicato dal sottoscritto ;) Apriamo quindi il prompt DOS e digitiamo "ftp <nome-server>" Dobbiamo quindi specificare l'utente e la password che intendiamo
utilizzare. Utente (chili.iol.it(none)): icarus Ok, siamo loggati e adesso smazziamoci i comandi…ah già, ma non
li conosciamo... Niente paura! Prima di cominciare a parlare del codice facciamo una piccola digressione riguardo al protocollo FTP :)
Il tutorial si allungherà un pochino, ma è necessario per
andare avanti. Help Possiamo addirittura sapere nello specifico cosa fa un comando digitando help mput Dopo aver negoziato la sessione col demone e aver immesso userID e password, se volessimo sapere quanto spazio abbiamo a disposizione e quali file sono già presenti basterebbe digitare il comando dir uguale a quello del DOS. Dobbiamo poi decidere il modo in cui uploadare il nostro file. Se il nostro è un file di testo sceglieremo il modo "ascii", ma se è un Mp3 da mettere sul nostro sito dobbiamo scegliere il modo "binary". I comandi per la scelta della modalità sono rispettivamente ascii e binary. Digitiamo quindi il nome del modo che ci serve ed avremo la conferma dal demone. Un comando utile per quando dobbiamo trasferire più files è prompt, che evita di farci ripetere sempre la domanda se siamo sicuri di voler caricare il file. Se i file sono 10 possiamo anche rispondere sempre di si, ma se i file sono 100 possiamo anche andare a prenderci un caffè ed evitare di stare dietro all'upload continuando a rispondere "yes". Quindi digitando prompt otteniamo in risposta l'attivazione o la disattivazione della domanda di conferma. Lo stato che ci interessa raggiungere è "prompt off". Supponiamo che il file icarus.vbp che vogliamo uploadare si trovi nella
directory c:\miei_files\vb. Dobbiamo quindi cambiare la
directory di lavoro locale. Se dovessimo invece cambiare directory all'interno dello spazio FTP useremmo il comando cd uguale al comando DOS. Dopo tutti questi preparativi, noiosi ma necessari, possiamo passare alla vera fase di upload. Il comando di upload vero e proprio non è unico ma ne esistono due. Uno per uploadare una serie di file (ad esempio *.vbp) elencati utilizzando le wildcard e/o separandoli da spazio e uno per uploadare un file unico. I comandi sono rispettivamente mput e put. Per quanto riguarda il download esistono comandi analoghi che, come possiamo comprendere spulciando l'elenco fornitoci con help, saranno mget e get. È possibile compiere anche altre operazioni come il cambio del nome, ma non elencheremo tutti i comandi uno per uno in questo tutorial. Basta affidarsi sempre all'help in linea. Cominciamo quindi con il codice vero e proprio. Per il design del nostro client utilizzeremo un paio di pulsanti in basso per connetterci, disconnetterci ed uscire dal programma, i cui loro rispettivi nomi saranno cmdConnect, cmdDisconnect e cmdExit. Avremo anche una serie di pulsanti per tre funzioni elementari: cmdUpload, cmdDownload e cmdChangeDir. Al centro abbiamo una Listbox chiamata ListOut per elencare i files remoti. L'ideale da fare sarebbe usare due ListBox per selezionare i files e magari uploadarli e downloadarli con un doppio click, oppure con una funzione di drag'n'drop, ma direi che sono argomenti che esulano dal target di questo tutorial e aggiungerebbero solo confusione all'argomento che vogliamo trattare, cioè l'uso del controllo Internet Transfer Control. Proprio questo sarà la prima cosa da piazzare all'interno del form e gli daremo il nome Inet1; nella finestra dell proprietà specificheremo il valore icFTP nella proprietà Protocol e 21 nella proprietà RemotePort. Le altre proprietà le imposteremo da codice. Un ultimo controllo da inserire è un Timerdi nome Timer1 che utilizzeremo per ritardare l'esecuzione di un comando. Impostiamo per esso le proprietà Interval a 1000 e la Enabled a False. Mi pareva carino creare una dialog a parte per effettuare il login e così ho fatto. Aggiungiamo quindi un form ed inseriamo in esso tre Label, tre TextBox denominate txtHost, txtUserID e txtPassword e due CommandButtondenominati OKButton e CancelButton. La prima textbox servirà per immettere l'indirizzo dell'host a cui collegarci. Per inciso sarebbe la parte che viene dopo ftp://. La seconda e la terza textbox serviranno per specificare UserID e Password.
Se l'accesso al server non è anonimo occorrerebbe settare un carattere
(di solito '*') per lo shadowing della password. Il contenuto di queste tre textbox verrà poi concatenato per formare qualcosa che assomiglia a ftp://UserID:Password@serverFtp.com ovvero un URL di accesso ad un sito FTP, comprendente UserID, Password e nome del server. Se proviamo a digitare tale URL nel nostro browser dovremmo riuscire a navigare in modo grafico il nostro spazio FTP. A questo punto ci si chiederebbe anche perché dobbiamo piagarci
le dita sulla tastiera per battere codice per fare un client sgrauso e
poco affidabile. In breve... Utilizziamo quindi i tre valori che abbiamo inserito nelle textbox andando a vedere il primo e più importante metodo del controllo Inet. Execute object.Execute url, operation, data, requestheader Se come url passiamo l'indirizzo del server FTP e usiamo il metodo Execute solo per connetterci allora gli altri parametri per adesso non serviranno. Cominciamo a vedere il codice della semplice dialog per effettuare il login:
Il click sul pulsante Annulla nasconderà il form in questione, restituendo il controllo al form principale che ha richiamato questo. Il click sopra il pulsante OK dovrà tentare la connessione all'host
specificato. Siamo nelle righe di codice della dialog e il controllo Inet che andiamo a utilizzare si trova nel form principale. Quindi per utilizzarlo dovremo effettuare il corretto riferimento al form principale, partendo dal nome del form per arrivare al nome del controllo. Alla riga 11 viene impostata la variabile ID a "DIR"
e dopo vedremo perché. Se il collegamento avesse generato un errore sarebbe stato mostrata una finestra esplicativa dell'errore (riga 16). Passiamo quindi al codice del form principale.
Alla riga 2 abbiamo dichiarato una variabile pubblica (cioè accessibile da ogni punto del codice) di nome ID. Essa verrà utilizzata per identificare i comandi da eseguire. In particolare verrà utilizzata per mostrare il contenuto della cartella remota ogni qual volta viene cambiata la cartella corrente oppure alla fine di un upload. Il codice compreso tra le righe 4-8 caricano, mostrano e scaricano la finestra dialog per effettuare il login al server remoto. Questo sarà eseguito alla pressione del pulsante Connect. Il click sopra il pulsante Disconnect dovrà disconnettere il client dal server e questo viene effettuato mediante l'invio del comando "CLOSE" (riga 11). Il click sopra il pulsante Exit provocherà lo scaricamento del form corrente e quindi la chiusura del programma (riga 15).
Ecco l'eventoStateChanged
del controllo Inet.
Il valore che utilizzeremo è l'icResponseCompleted ovvero il completamento dell'operazione. Pertanto, alla riga 12, viene controllato se il valore della variabile ID è "DIR" e lo stato è icResponseCompleted. Ciò significherà che il codice seguente sarà eseguito soltanto al completamento dell'operazione quando ID è uguale a "DIR". Più precisamente il codice sarà eseguito ogni volta che vogliamo aggiornare il contenuto della ListOut. Alla riga 22 leggiamo i dati dal controllo Inet1 mediante l'utilizzo
del metodo GetChunk. Tali dati saranno memorizzati nella variabile RITORNO
e conterranno l'elenco dei files e delle cartelle nella directory di lavoro
remota. Ogni file o cartella è separato dall'altro da un INVIO
(costantevbNewLine). Effettuata quest'operazione verrà azzerato il valore di ID, che verrà reimpostato ogni volta che si desidera elencare il contenuto della cartella remota.
Il Timer che abbiamo inserito sul form serve esclusivamente per elencare i files all'interno della cartella remota. Abbiamo dovuto inserirlo poiché se vogliamo elencare il contenuto della cartella subito immediatamente dopo essere entrati nella cartella, viene generato un errore. Il socket ha bisogno di una certa quantità di tempo prima di poter richiedere dati riguardo la cartella corrente. Non potremo cambiare cartella e al contempo elencarne il contenuto. Dovremo necessariamente attendere qualche decimo di secondo e poi richiamare il comando DIR di elencazione. Ecco il motivo di questo Timer. Alla riga 34 impostiamo la variabile ID a DIR, per il motivo già visto alla riga 21. Fatto questo richiediamo il comando "DIR" mediante il solito metodo Execute, disattiviamo il timer, ripuliamo la ListOut (riga 37) ed aggiungiamo i due collegamenti simbolici "." e ".." per permettere il ritorno alla cartella precedente (righe 38 e 39).
Il click sopra il pulsante Download scaricherà il file selezionato
nella ListBox. Alla riga 47 c'è la funzione che mostra una finestra di errore ogni qual volta si verifica un errore all'interno di questa Sub.
Il click sopra il pulsante Upload invierà il file FTP.FRM all'host remoto. Naturalmente in un vero client FTP il nome del file verrebbe scelto nel computer locale, ma questo esempio vuole soprattutto spiegare il meccanismo di collegamento tra i due computer, e non vuole essere un completo client FTP. Alla riga 52 viene eseguito il metodo Execute fornendogli come comando PUT seguito dal nome del file locale e il nome che il file deve assumere nel computer remoto. In seguito a questo viene attivato il Timer1 che provvederà autonomamente a richiedere l'elencazione della cartella remota dopo circa un secondo dall'attivazione. Questo per richiedere l'aggiornamento dell'elenco ListOut.
L'ultimo comando che vedremo sarà quello che permetterà il cambio di cartella di lavoro remota. Al click sopra il pulsante ChangeDir verrà inviato il comando CD seguito dal nome della cartella, letto dalla ListOut. In seguito all'invio del comando viene attivato il Timer1 che, dopo un secondo, rielencherà il contenuto della nuova cartella remota. Possiamo passare all'esecuzione del programma. Lanciamolo, premiamo il pulsante Connect, inseriamo il nome dell'host a cui collegarci, lo UserID e la Password e premiamo il pulsante OK. Se i dati inseriti saranno corretti, dovremmo vedere il contenuto della cartella remota. Una volta connessi, sarà possibile navigare tra le cartelle, cliccando sul nome della cartella e premendo il pulsante ChangeDir, potremo Uploadare il file FTP.FRM sul server remoto e downloadare sul nostro computer il file selezionato.
|
Conoscendo il protocollo FTP possiamo associare a diversi pulsanti un metodo Execute con l'argomento appropriato, per uploadare, downloadare, rinominare, cancellare tutti i file che vogliamo sul nostro spazio FTP. Le cose che si possono fare con questo controllo sono molteplici e sta alla fantasia del programmatore svilupparle. Alberto
Alagna
|
Torna all'indice Client/Server |