2009-02-08 7 views
56

Ist es möglich, eine Datei von einer Website im Windows-Antragsformular herunterzuladen und in ein bestimmtes Verzeichnis zu stellen?So laden Sie eine Datei von einer Website in C#

+0

was Transport besser machen? FTP? HTTP? –

+0

Mitchs Kommentar ist die direkteste und genaueste Antwort, lol! – Cerebrus

+0

Sofern Sie nicht neu bei .net sind, würde ich empfehlen, die MSDN-Dokumentation zu durchsuchen. Suchen Sie nach Dingen, die Sie erreichen möchten, lok in welchem ​​Namespace dies passt und sehen Sie, ob es eine Klasse gibt, die das tun kann. – shahkalpesh

Antwort

103

Mit dem 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

Danke, das hat genau so funktioniert, wie ich es wollte! – S3THST4

+0

Wie lade ich die Datei in einen Ordner relativ zum Verzeichnis der Anwendungsinstallation herunter? (Da Ihr Download-Pfad fest codiert ist) – RPDeshaies

+2

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

72

Verwendung WebClient.DownloadFile:

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

SKEEEEEEEEEEEEEET! – FlySwat

+0

IDisposable nicht vergessen; -p Aber (anders als ein "using") das ist genau das, was ich zum Schreiben kam ... –

+0

Ah, normaler Service von den Pedanten wird wieder aufgenommen ;-p –

12

Sicher, man muss nur ein HttpWebRequest verwenden.

Sobald Sie die HttpWebRequest eingerichtet haben, können Sie die Antwortstream in einer Datei speichern StreamWriter (Entweder BinaryWriter oder ein TextWriter je nach MIME-Typ.) Und Sie haben eine Datei auf Ihrer Festplatte.

EDIT: Forgot über WebClient. Das funktioniert gut, es sei denn, Sie müssen nur GET verwenden, um Ihre Datei abzurufen. Wenn die Website erfordert, dass Sie POST Informationen dazu, müssen Sie eine HttpWebRequest verwenden, so dass ich meine Antwort verlassen.

+0

Ich möchte es nicht von einem langsamen hd .. lesen. Https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.getresponse(v=vs.110).aspx – Dan

0

dieses Beispiel:

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(); 
} 

Die Umsetzung wird in der folgt durchgeführt:

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

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

0

Sie können auch DownloadFileAsync Methode in WebClient Klasse verwenden. Es lädt die Ressource mit der angegebenen Nummer URI in eine lokale Datei herunter. Auch diese Methode blockiert den aufrufenden Thread nicht.

Probe:

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

Für weitere Informationen:

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

2

Sie diesen Code verwenden können Datei von einer Website auf dem Desktop zum Download:

using System.Net; 

WebClient Client = new WebClient(); 
client.DownloadFileAsync(new Uri("http://www.Address.com/File.zip"), Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "File.zip"); 
12

Möglicherweise müssen Sie den Status während des Herunterladens der Datei kennen oder die Anmeldeinformationen verwenden, bevor Sie die Anfrage stellen.Hier

ist ein Beispiel, das diese Optionen umfasst:

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"); 
} 

Und die Funktionen des Callback wie folgt umgesetzt:

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-Notation: andere mögliche Option für die Handhabung der Ereignisse

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!"); 
}); 

Wir können

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!"); 
}; 

Oder

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

Wenn Sie 'async Task' anstelle von' async void' verwenden möchten, sehen Sie sich [diese Antwort] (http://stackoverflow.com/a/16514441/2816057) an, die 'awar WebClient.DownloadFileTaskAsync (...)' verwendet also keine Notwendigkeit für ein 'DownloadDataCompleted' Ereignis –

Verwandte Themen