2009-02-08 17 views
56

È possibile scaricare un file da un sito Web in un modulo di applicazione Windows e inserirlo in una determinata directory?Come scaricare un file da un sito Web in C#

+0

quello dei trasporti? FTP? HTTP? –

+0

Il commento di Mitch è la risposta più diretta e più accurata, lol! – Cerebrus

+0

Se non si è nuovi a .net, suggerirei di cercare la documentazione MSDN. Cerca le cose che vuoi raggiungere, guarda in quale spazio dei nomi potrebbe adattarsi e vedi se c'è una classe che può farlo :) – shahkalpesh

risposta

103

Con il WebClient class:

using System.Net; 
//... 
WebClient Client = new WebClient(); 
Client.DownloadFile("http://i.stackoverflow.com/Content/Img/stackoverflow-logo-250.png", @"C:\folder\stackoverflowlogo.png"); 
+0

Grazie, questo ha funzionato esattamente come volevo! – S3THST4

+0

Come si scarica il file in una cartella relativa alla directory di installazione dell'applicazione? (dal momento che il percorso di download è hardcoded) – RPDeshaies

+2

@ Tareck117 AppDomain.CurrentDomain.BaseDirectory + "myname" – Luntri

72

Uso WebClient.DownloadFile:

using (WebClient client = new WebClient()) 
{ 
    client.DownloadFile("http://csharpindepth.com/Reviews.aspx", 
         @"c:\Users\Jon\Test\foo.txt"); 
} 
+24

SKEEEEEEEEEEEEEET! – FlySwat

+0

Non dimenticare IDisposable ;-p Ma (a parte un "using") che è esattamente quello che sono entrato per scrivere ... –

+0

Ah, il normale servizio da parte dei pedanti è ripreso ;-p –

12

Certo, basta usare un HttpWebRequest.

volta che hai il HttpWebRequest impostato, è possibile salvare il flusso di risposta a un file StreamWriter (O BinaryWriter, o un TextWriter a seconda il tipo MIME.) E si dispone di un file sul disco rigido.

MODIFICA: Dimenticato in WebClient. Funziona bene a meno che tu abbia solo bisogno di usare GET per recuperare il tuo file. Se il sito richiede l'invio di informazioni su POST, sarà necessario utilizzare uno HttpWebRequest, pertanto la risposta non verrà visualizzata.

+0

Non voglio leggerlo da un hd lento .. https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse(v=vs.110).aspx – Dan

0

Prova questo esempio:

public void TheDownload(string path) 
{ 
    System.IO.FileInfo toDownload = new System.IO.FileInfo(HttpContext.Current.Server.MapPath(path)); 

    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.AddHeader("Content-Disposition", 
      "attachment; filename=" + toDownload.Name); 
    HttpContext.Current.Response.AddHeader("Content-Length", 
      toDownload.Length.ToString()); 
    HttpContext.Current.Response.ContentType = "application/octet-stream"; 
    HttpContext.Current.Response.WriteFile(patch); 
    HttpContext.Current.Response.End(); 
} 

L'implementazione avviene nel seguente modo:

TheDownload("@"c:\Temporal\Test.txt""); 

Fonte: http://www.systemdeveloper.info/2014/03/force-downloading-file-from-c.html

0

È inoltre possibile utilizzare il metodo DownloadFileAsync nella classe WebClient. Scarica in un file locale la risorsa con lo URI specificato. Anche questo metodo non blocca il thread chiamante.

Esempio:

webClient.DownloadFileAsync(new Uri("http://www.example.com/file/test.jpg"), "test.jpg"); 

Per maggiori informazioni:

http://csharpexamples.com/download-files-synchronous-asynchronous-url-c/

2

È possibile utilizzare questo codice per scaricare il file da un sito web al desktop:

12

Potrebbe essere necessario conoscere lo stato durante il download del file o utilizzare le credenziali prima di effettuare la richiesta.

Ecco un esempio che copre queste opzioni:

Uri ur = new Uri("http://remotehost.do/images/img.jpg"); 

using (WebClient client = new WebClient()) { 
    //client.Credentials = new NetworkCredential("username", "password"); 
    String credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes("Username" + ":" + "MyNewPassword")); 
    client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}"; 

    client.DownloadProgressChanged += WebClientDownloadProgressChanged; 
    client.DownloadDataCompleted += WebClientDownloadCompleted; 
    client.DownloadFileAsync(ur, @"C:\path\newImage.jpg"); 
} 

e funzioni del callback implementato come segue:

void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    Console.WriteLine("Download status: {0}%.", e.ProgressPercentage); 

    // updating the UI 
    Dispatcher.Invoke(() => { 
     progressBar.Value = e.ProgressPercentage; 
    }); 
} 

void WebClientDownloadCompleted(object sender, DownloadDataCompletedEventArgs e) 
{ 
    Console.WriteLine("Download finished!"); 
} 

Lambda notazione: altra opzione possibile per la gestione degli eventi

client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(delegate(object sender, DownloadProgressChangedEventArgs e) { 
    Console.WriteLine("Download status: {0}%.", e.ProgressPercentage); 

    // updating the UI 
    Dispatcher.Invoke(() => { 
     progressBar.Value = e.ProgressPercentage; 
    }); 
}); 

client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(delegate(object sender, DownloadDataCompletedEventArgs e){ 
    Console.WriteLine("Download finished!"); 
}); 

Possiamo fare di meglio

client.DownloadProgressChanged += (object sender, DownloadProgressChangedEventArgs e) => 
{ 
    Console.WriteLine("Download status: {0}%.", e.ProgressPercentage); 

    // updating the UI 
    Dispatcher.Invoke(() => { 
     progressBar.Value = e.ProgressPercentage; 
    }); 
}; 

client.DownloadDataCompleted += (object sender, DownloadDataCompletedEventArgs e) => 
{ 
    Console.WriteLine("Download finished!"); 
}; 

O

client.DownloadProgressChanged += (o, e) => 
{ 
    Console.WriteLine($"Download status: {e.ProgressPercentage}%."); 

    // updating the UI 
    Dispatcher.Invoke(() => { 
     progressBar.Value = e.ProgressPercentage; 
    }); 
}; 

client.DownloadDataCompleted += (o, e) => 
{ 
    Console.WriteLine("Download finished!"); 
}; 
+0

Se si desidera utilizzare l''attività asincrona' invece di 'vuoto asincrono', consultare [questa risposta] (http://stackoverflow.com/a/16514441/2816057) che utilizza' attendi webClient.DownloadFileTaskAsync (...) ' quindi non c'è bisogno di un evento 'DownloadDataCompleted' –

Problemi correlati