Leo Chapiro
Leo Chapiro

Reputation: 13984

How can I download a file using a WebBrowser control without using the File Download dialog box?

In a WPF project, I use the method

webBrowser.Navigate(strUrl);

to get a PNG picture from the server.

The following dialog appears:

File Download dialog screenshot

How could I download the picture seamlessly (without a dialog)?

Upvotes: 4

Views: 3698

Answers (1)

Neil B
Neil B

Reputation: 2224

You don't need to use a browser control for this.

Try using DownloadFileAsync()

Here is a fully working sample. (Change paths as needed.)

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        WebClient client = new WebClient();
        client.DownloadFileAsync(new Uri("https://www.example.com/filepath"), @"C:\Users\currentuser\Desktop\Test.png");
        client.DownloadFileCompleted += Client_DownloadFileCompleted;
        client.DownloadProgressChanged += Client_DownloadProgressChanged;
    }

    private void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
        TBStatus.Text = e.ProgressPercentage + "% " + e.BytesReceived + " of " + e.TotalBytesToReceive + " received.";
    }

    private void Client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        MessageBox.Show("Download Completed");
    }

You can open the downloaded file with the default app like this:

System.Diagnostics.Process.Start(@"C:\Users\currentuser\Desktop\Test.png");

EDIT:

If your goal is simply to display the png, you could download it to a stream, and then display it in an image control.

Fully working sample.

WebClient wc = new WebClient();
MemoryStream stream = new MemoryStream(wc.DownloadData("https://www.dropbox.com/s/l3maq8j3yzciedw/App%20in%205%20minutes.PNG?raw=1"));
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(stream);
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Position = 0;
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.StreamSource = stream;
bi.EndInit();
image1.Source = bi;

Here is the async version.

private void Button_Click(object sender, RoutedEventArgs e)
{
    WebClient wc = new WebClient();
    wc.DownloadDataAsync(new Uri("https://www.dropbox.com/s/l3maq8j3yzciedw/App%20in%205%20minutes.PNG?raw=1"));
    wc.DownloadDataCompleted += Wc_DownloadDataCompleted;
}

private void Wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
    MemoryStream stream = new MemoryStream((byte[])e.Result);
    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(stream);
    bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
    stream.Position = 0;
    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.StreamSource = stream;
    bi.EndInit();
    image1.Source = bi;
}

Upvotes: 2

Related Questions