I have this C# code but the final esi.zip results in 0 length or basically empty. The URL does exist and confirms to download the file manually. I am baffled buy this.
objFeedBO = new FeedBO();
string strfilename = System.IO.Path.GetFileName(url);
FileStream outputStream = new FileStream(DownloadPath + "\\" + strfilename, FileMode.Create);
string targetdownloadedFile = @"D:\TestZip.php";
WebClient myWebClient = new WebClient();
myWebClient.DownloadFileAsync(new Uri(url), targetdownloadedFile);
while (myWebClient.IsBusy) { }
Although this is an old thread, the so far given answers might not be sufficient to solve the "empty file" problem.
In case you are downloading from a https secure site, the "DownloadComplete" callback could indicate an error-free download, nevertheless the downloaded file might be empty. In my case, the advice given here helped. After adding the following line the download was ok:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
webClient.DownloadFileAsync(new System.Uri(link), savePath);
Here's the working code. There were 2 things you were not doing, that was causing the 0 byte file to be downloaded.
IsBusy. That needs to be called in order for the code to wait for the current thread to complete, since the an async action will be on a new thread.Create a blank console app and put the following code in it and try it out.
namespace TestDownload
{
class Program
{
static void Main(string[] args)
{
string sourceUrl = "http://ec.europa.eu/economy_finance/db_indicators/surveys/documents/series/nace2_ecfin_1409/all_surveys_total_sa_nace2.zip";
string targetdownloadedFile = @"C:\Temp\TestZip.zip";
DownloadManager downloadManager = new DownloadManager();
downloadManager.DownloadFile(sourceUrl, targetdownloadedFile);
}
}
}
using System;
using System.ComponentModel;
using System.Net;
namespace TestDownload
{
public class DownloadManager
{
public void DownloadFile(string sourceUrl, string targetFolder)
{
WebClient downloader = new WebClient();
// fake as if you are a browser making the request.
downloader.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0)");
downloader.DownloadFileCompleted += new AsyncCompletedEventHandler(Downloader_DownloadFileCompleted);
downloader.DownloadProgressChanged +=
new DownloadProgressChangedEventHandler(Downloader_DownloadProgressChanged);
downloader.DownloadFileAsync(new Uri(sourceUrl), targetFolder);
// wait for the current thread to complete, since the an async action will be on a new thread.
while (downloader.IsBusy) { }
}
private void Downloader_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
// print progress of download.
Console.WriteLine(e.BytesReceived + " " + e.ProgressPercentage);
}
private void Downloader_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
// display completion status.
if (e.Error != null)
Console.WriteLine(e.Error.Message);
else
Console.WriteLine("Download Completed!!!");
}
}
}
And when it's complete, you should see the zip file in the location specified in the targetdownloadedFile variable, which in this example is at C:\Temp\TestZip.zip on your local machine.
Adding this worked very fine for me! Thanks!
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;