Scaricare un file FTP tramite FtpWebRequest

di Cristian Civera, in System.Net,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

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

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi