#125 - Scaricare un file FTP tramite FtpWebRequest

Tra le molteplici classi offerte dal .NET Framework e in particolare nel namespace System.Net, è presente dalla versione 2.0 un'implementazione della classe WebRequest di nome FtpWebRequest. Come il nome suggerisce, la sua mansione è offrire le funzionalità minime per dialogare via FTP con un server remoto.

Poiché tale classe eredita da WebRequest, essa dispone di caratteristiche comuni quali autenticazione, uso di proxy o la possibilità di impostare header, attraverso le proprietà Credentials, Proxy e Headers. Per creare la classe quindi si sfrutta il factory associato al prefisso ftp://

FtpWebRequest GetRequest(Uri uri, string method) 
{ 
    FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(uri); 
    request.KeepAlive = true; 
    // Modalità passiva 
    request.UsePassive = true; 
    // Credenziali dell'utente corrente 
    request.Credentials = CredentialCache.DefaultNetworkCredentials; 
    request.Method = method; 
 
    return request; 
}

Alla richiesta creata occorre associare un method che identifica l'azione che si richiede. In modo simile ad HTTP, anche FTP dispone di metodi per effettuare operazioni in remoto di cui è disponibile una lista attraverso le costanti WebRequestMethods.Ftp. Per esempio per scaricare un file si utilizza RETR, restituito da WebRequestMethods.Ftp.DownloadFile.

// Creo l'oggetto di richieta FTP 
FtpWebRequest request = GetRequest(new Uri("ftp://miosito.it/file.zip"), WebRequestMethods.Ftp.DownloadFile);

Creata la richiesta si può ottenere lo stream da essa (in caso di upload) o ottenere la risposta dal server per analizzarne lo stato e prelevare lo stream, che nel caso di un RETR è il file stesso richiesto.

// Ottengo subito la risposta 
using (FtpWebResponse response = request.GetResponse() as FtpWebResponse) 
{ 
    // Controllo lo stato della risposta 
    if (response.StatusCode != FtpStatusCode.DataAlreadyOpen) 
        throw new InvalidOperationException("Error while getting file: " + response.StatusDescription); 
 
    using (Stream dataStream = response.GetResponseStream()) 
    { 
        // Leggo lo stream del file 
        using (Stream localStream = File.Create("file.zip")) 
        { 
            // Travaso da uno stream all'altro 
            dataStream.CopyToStream(localStream); 
        } 
    } 
}

Ottenuto lo stream, come si vede nel codice precedente, si può leggerlo o semplicemente travasarlo su un file locale attraverso l'extension method dello script #93.

Commenti

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Segnala su:  Facebook  Messenger  Twitter        |

Approfondimenti