Download image from the site in .NET/C#

147,671

Solution 1

There is no need to involve any image classes, you can simply call WebClient.DownloadFile:

string localFilename = @"c:\localpath\tofile.jpg";
using(WebClient client = new WebClient())
{
    client.DownloadFile("http://www.example.com/image.jpg", localFilename);
}

Update
Since you will want to check whether the file exists and download the file if it does, it's better to do this within the same request. So here is a method that will do that:

private static void DownloadRemoteImageFile(string uri, string fileName)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    // Check that the remote file was found. The ContentType
    // check is performed since a request for a non-existent
    // image file might be redirected to a 404-page, which would
    // yield the StatusCode "OK", even though the image was not
    // found.
    if ((response.StatusCode == HttpStatusCode.OK || 
        response.StatusCode == HttpStatusCode.Moved || 
        response.StatusCode == HttpStatusCode.Redirect) &&
        response.ContentType.StartsWith("image",StringComparison.OrdinalIgnoreCase))
    {

        // if the remote file was found, download oit
        using (Stream inputStream = response.GetResponseStream())
        using (Stream outputStream = File.OpenWrite(fileName))
        {
            byte[] buffer = new byte[4096];
            int bytesRead;
            do
            {
                bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                outputStream.Write(buffer, 0, bytesRead);
            } while (bytesRead != 0);
        }
    }
}

In brief, it makes a request for the file, verifies that the response code is one of OK, Moved or Redirect and also that the ContentType is an image. If those conditions are true, the file is downloaded.

Solution 2

I have used Fredrik's code above in a project with some slight modifications, thought I'd share:

private static bool DownloadRemoteImageFile(string uri, string fileName)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    HttpWebResponse response;
    try
    {
        response = (HttpWebResponse)request.GetResponse();
    }
    catch (Exception)
    {
        return false;
    }

    // Check that the remote file was found. The ContentType
    // check is performed since a request for a non-existent
    // image file might be redirected to a 404-page, which would
    // yield the StatusCode "OK", even though the image was not
    // found.
    if ((response.StatusCode == HttpStatusCode.OK ||
        response.StatusCode == HttpStatusCode.Moved ||
        response.StatusCode == HttpStatusCode.Redirect) &&
        response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
    {

        // if the remote file was found, download it
        using (Stream inputStream = response.GetResponseStream())
        using (Stream outputStream = File.OpenWrite(fileName))
        {
            byte[] buffer = new byte[4096];
            int bytesRead;
            do
            {
                bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                outputStream.Write(buffer, 0, bytesRead);
            } while (bytesRead != 0);
        }
        return true;
    }
    else
        return false;
}

Main changes are:

  • using a try/catch for the GetResponse() as I was running into an exception when the remote file returned 404
  • returning a boolean

Solution 3

Also possible to use DownloadData method

    private byte[] GetImage(string iconPath)
    {
        using (WebClient client = new WebClient())
        {
            byte[] pic = client.DownloadData(iconPath);
            //string checkPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +@"\1.png";
            //File.WriteAllBytes(checkPath, pic);
            return pic;
        }
    }
Share:
147,671
Geeth
Author by

Geeth

Updated on July 08, 2022

Comments

  • Geeth
    Geeth almost 2 years

    I am trying to download images from the site. The code which I am using is working fine while the image is available. If the image it not available it is creating a problem. How to validate availability of the image?

    Code:

    Method 1:

    WebRequest requestPic = WebRequest.Create(imageUrl);
    
    WebResponse responsePic = requestPic.GetResponse();
    
    Image webImage = Image.FromStream(responsePic.GetResponseStream()); // Error
    
    webImage.Save("D:\\Images\\Book\\" + fileName + ".jpg");
    

    Method 2:

    WebClient client = new WebClient();
    Stream stream = client.OpenRead(imageUrl);
    
    bitmap = new Bitmap(stream); // Error : Parameter is not valid.
    stream.Flush();
    stream.Close();
    client.dispose();
    
    if (bitmap != null)
    {
        bitmap.Save("D:\\Images\\" + fileName + ".jpg");
    }
    

    Edit:

    Stream has the following statements:

          Length  '((System.Net.ConnectStream)(str)).Length' threw an exception of type  'System.NotSupportedException'    long {System.NotSupportedException}
        Position  '((System.Net.ConnectStream)(str)).Position' threw an exception of type 'System.NotSupportedException'    long {System.NotSupportedException}
     ReadTimeout  300000    int
    WriteTimeout  300000    int
    
  • Darin Dimitrov
    Darin Dimitrov over 13 years
    Don't forget to dispose the WebClient.
  • Fredrik Mörk
    Fredrik Mörk over 13 years
    @Geetha: do you get an image if you try to navigate to the given URL in a web browser?
  • Fredrik Mörk
    Fredrik Mörk over 13 years
    @Geetha: it sounds as if you would first want to check if the image exists, then download it. For that first step, check here: stackoverflow.com/questions/1379371/…
  • Geeth
    Geeth over 13 years
    It is taking too much of time and also downloading blank image. the line bitmap = new Bitmap(stream); shows error: Parameter is not valid
  • bernhardrusch
    bernhardrusch about 11 years
    thank you - looks like well written code and works well in my application
  • Johann
    Johann over 10 years
    "There is no need to involve any image classes". Actually there is a need if you're intention is download an image, manipulate it and simply display it. There is no need to store a file or even fill up a disk with images if there is no need to store the file.
  • Alex Zhukovskiy
    Alex Zhukovskiy over 8 years
    Why return a boolean flag when you can throw an exception? It's always better until you have performance problems. SRP does not allow to have these methods.
  • Nissa
    Nissa over 7 years
    Perhaps you could explain this code, and why it works?