Using a WebClient to save an image with the approp

2019-05-21 18:46发布

问题:

I'm required to retrieve and save an image from a website to my local folder. The image type varies between .png, .jpg and .gif

I've tried using

string url = @"http://redsox.tcs.auckland.ac.nz/CSS/CSService.svc/";
string saveLoc = @"/project1/home_image";
using (var wc = new WebClient())
{
    wc.DownloadFile(url, saveLoc);
}

but this saves the file 'home_image' in the folder without the extension. My question is how do you determine the extension? Is there a simple way to do this? Can one use the Content-Type of the HTTP request? If so, how do you do this?

回答1:

If you want to use a WebClient, then you have to extract the header information from WebClient.ResponseHeaders. You'll have to store it as a byte array first, and then save the file after getting your file information.

string url = @"http://redsox.tcs.auckland.ac.nz/CSS/CSService.svc/";
string saveLoc = @"/project1/home_image";

using (WebClient wc = new WebClient())
{
    byte[] fileBytes = wc.DownloadData(url);

    string fileType = wc.ResponseHeaders[HttpResponseHeader.ContentType];

    if (fileType != null)
    {
        switch (fileType)
        {
            case "image/jpeg":
                saveloc += ".jpg";
                break;
            case "image/gif":
                saveloc += ".gif";
                break;
            case "image/png":
                saveloc += ".png";
                break;
            default:
                break;
        }

        System.IO.File.WriteAllBytes(saveloc, fileBytes);
    }
}

I like my extensions to be 3 letters long if they can.... personal preference. If it doesn't bother you, you can replace the entire switch statement with:

saveloc += "." + fileType.Substring(fileType.IndexOf('/') + 1);

Makes the code a little neater.



回答2:

Try something like this

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("Your URL");
 request.Method = "GET";
 var response = request.GetResponse();
 var contenttype = response.Headers["Content-Type"]; //Get the content type and extract the extension.
 var stream = response.GetResponseStream();

Then save the stream