• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 266
  • Last Modified:

How do you save web server Image file to Client Hard drive

Trying to allow the client to save an image file from the web server when they are browsing website to their hard drive and choose a file name and where they save it!

but code below doesn't work as don't have permission to save to client disk.

Any ideas for alternative way please?

        protected void ImageBtnDownload_Click(object sender, ImageClickEventArgs e)
        {
            string localFilename = @"c:\testfile.jpg";
            using (WebClient client = new WebClient())
            {
                client.DownloadFile("http://www.yourwebsite.co.uk/images/test small.png","localFilename");
            }
        }
0
stephenwilde
Asked:
stephenwilde
  • 7
  • 5
1 Solution
 
käµfm³d 👽Commented:
And that won't work. That code runs on the server, not the client. You're effectively trying to download a file from the server to the server.

What you need to do instead is trigger a download prompt on the client. The way you do that is by specifying a specific set of headers, and changing the response that goes back.

protected void ImageBtnDownload_Click(object sender, ImageClickEventArgs e)
{
    string localFilename = @"c:\testfile.jpg";
    byte[] data = File.ReadAllBytes(localFilename);
    Response.Clear();
    Response.Headers["Content-Type"] = "image/jpeg";
    Response.Headers["Content-Disposition"] = "Content-Disposition: attachment; filename='" + Path.GetFileName(localFilename) + "'";
    Response.BinaryWrite(data);
    Response.Flush();
}

Open in new window

0
 
stephenwildeAuthor Commented:
Thank you for code but it failed when run on my development environment (windows and .net visual studio 2010)

Fails on (using png not jpg) ;
Response.Headers["Content-Type"] = "image/png";

with error:
This operation requires IIS integrated pipeline mode.
0
 
käµfm³d 👽Commented:
Change your application pool from "Classic" mode to "Integrated Pipeline".
0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
stephenwildeAuthor Commented:
Googled the term but could not find a suitable way to change settings
0
 
käµfm³d 👽Commented:
Select your project within Solution Explorer. Then hit F4 to bring up the Properties pane. Change the value of "Managed Pipeline Mode."

Screenshot
0
 
stephenwildeAuthor Commented:
Thanks for going to the trouble of a screen grab

But my f4 brings up Project Properties and first line development server but under it is only one choice:

Always start when debugging

the other choices on your screen shot are not present, so cannot change managed pipeline mode

it is Visual studio 210 and a web project.
0
 
käµfm³d 👽Commented:
...and a web project.
Is it a web site or a web application?
0
 
stephenwildeAuthor Commented:
website project in .net c#
0
 
käµfm³d 👽Commented:
I'll have to dig around on this one. I usually don't create web site projects, so I am not too familiar with them (as opposed to web applications). The Integrated Pipeline may not be available for those project types.

Regardless, the headers that I mention above are what you need to include in your response to the client. How you get them in there is the question at hand now.
0
 
stephenwildeAuthor Commented:
Thanks

I did transfer code to web server and received the same error;

This operation requires IIS integrated pipeline mode

It is an old Windows server 2005

But not keen to change IIS settings in case it effects other websites hosted on the server.
0
 
stephenwildeAuthor Commented:
Thanks for your help - Problem now solved - it is mixing .net 4 and IIS 6

So need to use another way to add Headers code was finally;

  string ImagePath = System.Web.HttpContext.Current.Server.MapPath("~/Images");
            string Filename = "test file small.png";
            string LocalFilename = ImagePath + "\\" + Filename ;
            FileInfo Imagefile = new FileInfo(LocalFilename) ;
            Response.Clear();
            Response.ClearHeaders();
            Response.AddHeader("Content-Disposition","attachment; filename=" + Filename) ;
            Response.AddHeader("Content-Length", Imagefile.Length.ToString());
            Response.AddHeader("Content-Type","application/octet-stream");
            Response.WriteFile(LocalFilename);
            Response.End();

Open in new window

0
 
stephenwildeAuthor Commented:
Thanks

see my Final post re Add Headers - for solution if using different .net version / IIS
0

Featured Post

2018 Annual Membership Survey

Here at Experts Exchange, we strive to give members the best experience. Help us improve the site by taking this survey today! (Bonus: Be entered to win a great tech prize for participating!)

  • 7
  • 5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now