下载文件并自动将其保存到文件夹

我正在尝试创建一个用于从我的网站下载文件的UI。 该站点具有zip文件,需要将这些文件下载到用户输入的目录中。 但是,我无法成功下载该文件,它只是从一个临时文件夹打开。

码:

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

完整源代码: http : //en.paidpaste.com/LqEmiQ

为什么不完全绕过WebClient的文件处理部分。 也许类似的东西:

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

我的程序完全符合您的要求,没有任何提示或任何内容,请参阅以下代码。

如果它们尚不存在,此代码将创建所有必需的目录:

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

此代码将给定文件下载到给定目录(在前一个代码段创建之后:

 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 } 

因此,使用这两段代码,您可以创建所有目录,然后告诉下载程序(不会提示您将文件下载到该位置。

如果您不想使用“WebClient”或/并且需要使用System.Windows.Forms.WebBrowser,例如因为您希望首先模拟登录,则可以使用此扩展的WebBrowser来挂接Windows中的“URLDownloadToFile”方法URLMON Lib并使用WebBrowser的Context

信息: 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 { ///  /// 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. ///  /// Pointer to caller object (AX). /// String of the URL. /// String of the destination filename/path. /// [reserved]. /// A callback function to monitor progress or abort. /// 0 for okay. /// 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); ///  /// Download a file from the webpage and save it to the destination without promting the user ///  /// the url with the file /// the absolut full path with the filename as destination ///  public FileInfo DownloadFile(string url, string destinationFullPathWithName) { URLDownloadToFile(null, url, destinationFullPathWithName, 0, IntPtr.Zero); return new FileInfo(destinationFullPathWithName); } } } 

那么,你的解决方案几乎可行。 为了简单起见,有几点需要考虑:

  • 仅针对您知道将发生下载的特定URL取消默认导航,否则用户将无法在任何位置导航。 这意味着您不会更改您的网站下载URL。

  • DownloadFileAsync不知道服务器在Content-Disposition标头中报告的名称,因此您必须指定一个名称,或者如果可能的话,从原始URL计算一个名称。 您不能只指定文件夹并期望自动检索文件名。

  • 您必须处理DownloadCompleted回调中的下载服务器错误,因为Web浏览器控件将不再为您执行此操作。

示例代码段,将下载到textBox1指定的目录中,但具有随机文件名,并且没有任何其他error handling:

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

该解决方案应该可以工作,但可以很容易地解决。 尝试考虑列出可供下载的可用文件的一些Web服务,并为其创建自定义UI。 它会更简单,你将控制整个过程。

在webclient上查看http://www.csharp-examples.net/download-files/和msdn docs http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx

我的建议是尝试同步下载更直接。 您可能会在尝试此操作时获得有关webclient参数是否错误或文件格式是否格式错误的建议。

这是一个代码示例..

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

一个更简单的解决方案是使用Chrome下载文件。 通过这种方式,您无需手动单击“保存”按钮。

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