What is a simple way of downloading a file from a URL path?
问题:
回答1:
using (var client = new WebClient())
{
client.DownloadFile(\"http://example.com/file/song/a.mpeg\", \"a.mpeg\");
}
回答2:
Include this namespace
using System.Net;
Download Asynchronously and put a ProgressBar to show the status of the download within the UI Thread Itself
private void BtnDownload_Click(object sender, RoutedEventArgs e)
{
using (WebClient wc = new WebClient())
{
wc.DownloadProgressChanged += wc_DownloadProgressChanged;
wc.DownloadFileAsync (
// Param1 = Link of file
new System.Uri(\"http://www.sayka.com/downloads/front_view.jpg\"),
// Param2 = Path to save
\"D:\\\\Images\\\\front_view.jpg\"
);
}
}
// Event to track the progress
void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
回答3:
Use System.Net.WebClient.DownloadFile
:
string remoteUri = \"http://www.contoso.com/library/homepage/images/\";
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);
}
回答4:
using System.Net;
WebClient webClient = new WebClient();
webClient.DownloadFile(\"http://mysite.com/myfile.txt\", @\"c:\\myfile.txt\");
回答5:
Complete class to download a file while printing status to console.
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);
}
}
Usage:
static void Main(string[] args)
{
var success = FileDownloader.DownloadFile(fileUrl, fullPathWhereToSave, timeoutInMilliSec);
Console.WriteLine(\"Done - success: \" + success);
Console.ReadLine();
}
回答6:
Also you can use DownloadFileAsync method in WebClient class. It downloads to a local file the resource with the specified URI. Also this method does not block the calling thread.
Sample:
webClient.DownloadFileAsync(new Uri(\"http://www.example.com/file/test.jpg\"), \"test.jpg\");
For more information:
http://csharpexamples.com/download-files-synchronous-asynchronous-url-c/
回答7:
Check for a network connection using GetIsNetworkAvailable()
to avoid creating empty files when not connected to a network.
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\");
}
}
回答8:
Try using this:
private void downloadFile(string url)
{
string file = System.IO.Path.GetFileName(url);
WebClient cln = new WebClient();
cln.DownloadFile(url, file);
}
回答9:
Below code contain logic for download file with original name
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);
}
回答10:
You may need to know the status and update a ProgressBar during the file download or use credentials before making the request.
Here it is, an example that covers these options. Lambda notation and String interpolation has been used:
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\");
}
回答11:
Instead of downloading this to a local file, you can convert to a byte stream object and store as a varbinary(MAX) BLOB in SQL Server.
Given that your table looks like:
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();