495 Stimmen

Wie man eine Datei von einer URL in C# herunterladen?

Wie kann man auf einfache Weise eine Datei von einem URL-Pfad herunterladen?

4voto

Cryptc Punkte 1631

Für den Fall, dass Sie die Kopfzeilen y Cookies um eine Datei herunterzuladen, müssen Sie etwas anders vorgehen. Hier ist eine Beispiel ...

// Pass in the HTTPGET URL, Full Path w/Filename, and a populated Cookie Container (optional)
private async Task DownloadFileRequiringHeadersAndCookies(string getUrl, string fullPath, CookieContainer cookieContainer, CancellationToken cancellationToken)
{
    cookieContainer ??= new CookieContainer();  // TODO: FILL ME AND PASS ME IN

    using (var handler = new HttpClientHandler()
    {
        UseCookies = true,
        CookieContainer = cookieContainer, // This will, both, use the cookies passed in, and update/create cookies from the response
        ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true, // use only if it gets angry about the SSL endpoints
        AllowAutoRedirect = true,
    })
    {
        using (var client = new HttpClient(handler))
        {
            SetHeaders(client);

            using (var response = await client.GetAsync(getUrl, cancellationToken))
            {
                if (response.IsSuccessStatusCode)
                {
                    var bytes = await response.Content.ReadAsByteArrayAsync(cancellationToken);
                    await File.WriteAllBytesAsync(fullPath, bytes, cancellationToken); // This overwrites the file
                }
                else
                {
                    // TODO: HANDLE ME
                    throw new FileNotFoundException();
                }
            }
        }
    }
}

Und, um die Kopfzeilen hinzuzufügen, die Sie benötigen, mit diesem...

private void SetHeaders(HttpClient client)
{
    // TODO: SET ME
    client.DefaultRequestHeaders.Connection.Add("keep-alive");
    client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...");
    client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9, ...");
    client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
    client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
    client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("en-US"));
    client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("en", .9));
    ...
}

ASIDE: Sie können den CookieContainer füllen, indem Sie:

  1. Schleifenbildung durch die Cookies einer vorherigen Antwort.
    • Diese Antwort könnte von HttpAgilityPack, WebClient oder Puppeteer stammen (viele Optionen)
  2. Manuelle Einträge (aus Konfigurationswerten oder hart kodierten Werten).

3voto

Kreshnik Punkte 2431

Möglicherweise müssen Sie den Status kennen und einen Fortschrittsbalken während des Dateidownloads aktualisieren oder vor der Anforderung Anmeldeinformationen verwenden.

Hier ist ein Beispiel, das diese Optionen abdeckt. Lambda-Notation y String-Interpolation verwendet wurde:

using System.Net;
// ...

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

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

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

    client.DownloadFileAsync(ur, @"C:\path\newImage.jpg");
}

3voto

Kiran Shahi Punkte 6718

Meine Recherchen haben ergeben, dass WebClient.DownloadFileAsync ist der beste Weg, um eine Datei herunterzuladen. Sie ist verfügbar in System.Net Namespace und es unterstützt auch .net core.

Hier ist der Beispielcode zum Herunterladen der Datei.

using System;
using System.IO;
using System.Net;
using System.ComponentModel;

public class Program
{
    public static void Main()
    {
        new Program().Download("ftp://localhost/test.zip");
    }
    public void Download(string remoteUri)
    {
        string FilePath = Directory.GetCurrentDirectory() + "/tepdownload/" + Path.GetFileName(remoteUri); // path where download file to be saved, with filename, here I have taken file name from supplied remote url
        using (WebClient client = new WebClient())
        {
            try
            {
                if (!Directory.Exists("tepdownload"))
                {
                    Directory.CreateDirectory("tepdownload");
                }
                Uri uri = new Uri(remoteUri);
                //password username of your file server eg. ftp username and password
                client.Credentials = new NetworkCredential("username", "password");
                //delegate method, which will be called after file download has been complete.
                client.DownloadFileCompleted += new AsyncCompletedEventHandler(Extract);
                //delegate method for progress notification handler.
                client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgessChanged);
                // uri is the remote url where filed needs to be downloaded, and FilePath is the location where file to be saved
                client.DownloadFileAsync(uri, FilePath);
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
    public void Extract(object sender, AsyncCompletedEventArgs e)
    {
        Console.WriteLine("File has been downloaded.");
    }
    public void ProgessChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine($"Download status: {e.ProgressPercentage}%.");
    }
}

Mit dem obigen Code wird die Datei in tepdownload Ordner des Projektverzeichnisses. Bitte lesen Sie den Kommentar im Code, um zu verstehen, was der obige Code bewirkt.

3voto

M22 Punkte 387
static void Main(string[] args)
        {
            DownloadFileAsync().GetAwaiter();

            Console.WriteLine("File was downloaded");
            Console.Read();
        }

        private static async Task DownloadFileAsync()
        {
            WebClient client = new WebClient();
            await client.DownloadFileTaskAsync(new Uri("http://somesite.com/myfile.txt"), "mytxtFile.txt");
        }

2voto

Cryptc Punkte 1631

In .NET Core MVC können Sie es manchmal so einfach machen wie:

public async Task<ActionResult> DownloadUrl(string url) {
    return Redirect(url);
}

Dies setzt wahrscheinlich voraus, dass der MIME-Typ, den Sie versuchen herunterzuladen, so eingestellt ist, dass er vom Browser heruntergeladen werden kann (z. B. .mp4), so dass er nicht versucht, auf eine Webseite umzuleiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X