wake-up-neo.net

Laden Sie die Datei herunter und speichern Sie sie automatisch in einem Ordner

Ich versuche, eine Benutzeroberfläche zum Herunterladen von Dateien von meiner Website zu erstellen. Die Site enthält Zip-Dateien, die in das vom Benutzer eingegebene Verzeichnis heruntergeladen werden müssen. Ich kann die Datei jedoch nicht herunterladen, sie wird nur aus einem temporären Ordner geöffnet.

Code:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
        e.Cancel = true;
        string filepath = null;
            filepath = textBox1.Text;
            WebClient client = new WebClient();
            client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
            client.DownloadFileAsync(e.Url, filepath);
}

Vollständiger Quellcode: http://de.paidpaste.com/LqEmiQ

9

Warum umgehen Sie nicht einfach die Dateien des WebClient, die alle Teile gemeinsam bearbeiten. Vielleicht etwas ähnliches:

    private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
    {
        e.Cancel = true;
        WebClient client = new WebClient();

        client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(client_DownloadDataCompleted);

        client.DownloadDataAsync(e.Url);
    }

    void client_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
    {
        string filepath = textBox1.Text;
        File.WriteAllBytes(filepath, e.Result);
        MessageBox.Show("File downloaded");
    }
13
SamuelWarren

Mein Programm macht genau das, wonach Sie suchen, keine Eingabeaufforderungen oder ähnliches. Bitte lesen Sie den folgenden Code.

Dieser Code erstellt alle erforderlichen Verzeichnisse, falls diese noch nicht vorhanden sind:

Directory.CreateDirectory(C:\dir\dira\dirb);  // This code will create all of these directories  

Dieser Code lädt die angegebene Datei in das angegebene Verzeichnis herunter (nachdem sie vom vorherigen Snippet erstellt wurde:

private void install()
    {
        WebClient webClient = new WebClient();                                                          // Creates a webclient
        webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);                   // Uses the Event Handler to check whether the download is complete
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);  // Uses the Event Handler to check for progress made
        webClient.DownloadFileAsync(new Uri("http://www.com/newfile.Zip"), @"C\newfile.Zip");           // Defines the URL and destination directory for the downloaded file
    }

Wenn Sie also diese beiden Codeteile verwenden, können Sie alle Verzeichnisse erstellen und dem Downloader mitteilen (das fordert Sie nicht auf, die Datei an diesen Speicherort herunterzuladen.).

19
user863551

Wenn Sie "WebClient" oder/nicht verwenden möchten und den System.Windows.Forms.WebBrowser verwenden möchten, z. Da Sie zunächst ein Login simulieren möchten, können Sie diesen erweiterten WebBrowser verwenden, der die "URLDownloadToFile" -Methode aus der Windows URLMON Lib einhakt und den Kontext des WebBrowser verwendet

Infos: http://www.pinvoke.net/default.aspx/urlmon/URLDownloadToFile%20.html

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace dataCoreLib.Net.Webpage
{
        public class WebBrowserWithDownloadAbility : WebBrowser
        {
            /// <summary>
            /// The URLMON library contains this function, URLDownloadToFile, which is a way
            /// to download files without user prompts.  The ExecWB( _SAVEAS ) function always
            /// prompts the user, even if _DONTPROMPTUSER parameter is specified, for "internet
            /// security reasons".  This function gets around those reasons.
            /// </summary>
            /// <param name="callerPointer">Pointer to caller object (AX).</param>
            /// <param name="url">String of the URL.</param>
            /// <param name="filePathWithName">String of the destination filename/path.</param>
            /// <param name="reserved">[reserved].</param>
            /// <param name="callBack">A callback function to monitor progress or abort.</param>
            /// <returns>0 for okay.</returns>
            /// source: http://www.pinvoke.net/default.aspx/urlmon/URLDownloadToFile%20.html
            [DllImport("urlmon.dll", CharSet = CharSet.Auto, SetLastError = true)]
            static extern Int32 URLDownloadToFile(
                [MarshalAs(UnmanagedType.IUnknown)] object callerPointer,
                [MarshalAs(UnmanagedType.LPWStr)] string url,
                [MarshalAs(UnmanagedType.LPWStr)] string filePathWithName,
                Int32 reserved,
                IntPtr callBack);


            /// <summary>
            /// Download a file from the webpage and save it to the destination without promting the user
            /// </summary>
            /// <param name="url">the url with the file</param>
            /// <param name="destinationFullPathWithName">the absolut full path with the filename as destination</param>
            /// <returns></returns>
            public FileInfo DownloadFile(string url, string destinationFullPathWithName)
            {
                URLDownloadToFile(null, url, destinationFullPathWithName, 0, IntPtr.Zero);
                return new FileInfo(destinationFullPathWithName);
            }
        }
    }
16
dataCore

Nun, Ihre Lösung funktioniert fast. Es sind einige Dinge zu beachten, um es einfach zu halten:

  • Deaktivieren Sie die Standardnavigation nur für bestimmte URLs, von denen Sie wissen, dass ein Download stattfindet, oder der Benutzer kann nirgendwo navigieren. Dies bedeutet, dass Sie die URLs zum Herunterladen Ihrer Website nicht ändern müssen.

  • DownloadFileAsync kennt den Namen, den der Server im Content-Disposition-Header angibt, nicht. Sie müssen also einen Namen angeben oder den ursprünglichen URL berechnen, sofern dies möglich ist. Sie können den Ordner nicht einfach angeben und erwarten, dass der Dateiname automatisch abgerufen wird.

  • Sie müssen Download-Server-Fehler vom DownloadCompleted-Callback aus behandeln, da die Webbrowser-Steuerung dies nicht mehr für Sie erledigt.

Beispielcode, der in das in textBox1 angegebene Verzeichnis heruntergeladen wird, jedoch mit einem zufälligen Dateinamen und ohne zusätzliche Fehlerbehandlung:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
    /* change this to match your URL. For example, if the URL always is something like "getfile.php?file=xxx", try e.Url.ToString().Contains("getfile.php?") */
    if (e.Url.ToString().EndsWith(".Zip")) {
        e.Cancel = true;
        string filePath = Path.Combine(textBox1.Text, Path.GetRandomFileName());
        var client = new WebClient();
        client.DownloadFileCompleted += client_DownloadFileCompleted;
        client.DownloadFileAsync(e.Url, filePath);
    }
}

private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) {
    MessageBox.Show("File downloaded");
}

Diese Lösung sollte funktionieren, kann aber sehr leicht zerstört werden. Versuchen Sie, einen Webservice in Betracht zu ziehen, der die verfügbaren Dateien zum Download auflistet, und erstellen Sie eine benutzerdefinierte Benutzeroberfläche. Es wird einfacher und Sie steuern den gesamten Prozess.

1

Werfen Sie einen Blick auf http://www.csharp-examples.net/download-files/ Und msdn docs auf webclient http://msdn.Microsoft.com/de-de/library/system.net.webclient.aspx

Mein Vorschlag ist der synchrone Download, da es einfacher ist. Wenn Sie dies versuchen, erhalten Sie möglicherweise Anregungen, ob die Webclient-Parameter falsch sind oder ob die Datei ein falsches Format hat.

Hier ist ein Codebeispiel ..

private void btnDownload_Click(object sender, EventArgs e)
{
  string filepath = textBox1.Text;
  WebClient webClient = new WebClient();
  webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
  webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
  webClient.DownloadFileAsync(new Uri("http://mysite.com/myfile.txt"), filepath);
}

private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
  progressBar.Value = e.ProgressPercentage;
}

private void Completed(object sender, AsyncCompletedEventArgs e)
{
  MessageBox.Show("Download completed!");
}
0
Mulki

Eine viel einfachere Lösung wäre das Herunterladen der Datei mit Chrome. Auf diese Weise müssen Sie nicht manuell auf die Schaltfläche "Speichern" klicken. 

using System;
using System.Diagnostics;
using System.ComponentModel;

namespace MyProcessSample
{
    class MyProcess
    {
        public static void Main()
        {
            Process myProcess = new Process();
            myProcess.Start("chrome.exe","http://www.com/newfile.Zip");
        }
    }
}