ASP.NET MVC download image rather than display in browser

38,293

Solution 1

I believe you can control this with the content-disposition header.

Response.AddHeader(
       "Content-Disposition", "attachment; filename=\"filenamehere.png\""); 

Solution 2

You need to set the following headers on the response:

  • Content-Disposition: attachment; filename="myfile.png"
  • Content-Type: application/force-download

Solution 3

I actually came here because I was looking for the opposite effect.

    public ActionResult ViewFile()
    {
        string contentType = "Image/jpeg";



        byte[] data = this.FileServer("FileLocation");

        if (data == null)
        {
            return this.Content("No picture for this program.");
        }

        return File(data, contentType, img + ".jpg");
    }

Solution 4

With MVC I use a FileResult and return a FilePathResult

public FileResult ImageDownload(int id)
    {
        var image = context.Images.Find(id);
        var imgPath = Server.MapPath(image.FilePath);
        return File(imgPath, "image/jpeg", image.FileName);
    }

Solution 5

The correct way to download file in your case is to use FileResult class.

 public FileResult DownloadFile(string id)
{
try
{
    byte[] imageBytes =  ANY IMAGE SOURCE (PNG)
    MemoryStream ms = new MemoryStream(imageBytes);
    var image = System.Drawing.Image.FromStream(ms);
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    var fileName = string.Format("{0}.png", "ANY GENERIC FILE NAME");
    return File(ms.ToArray(), "image/png", fileName);
}
catch (Exception)
{
}
return null;
}
Share:
38,293
RSolberg
Author by

RSolberg

@russsolberg http://rsolberg.com

Updated on October 10, 2020

Comments

  • RSolberg
    RSolberg over 3 years

    Rather than displaying a PNG in the browser window, I'd like the action result to trigger the file download dialogue box (you know the open, save as, etc). I can get this to work with the code below using an unknown content type, but the user then has to type in .png at the end of the file name. How can I accomplish this behavior without forcing the user to type in the file extension?

        public ActionResult DownloadAdTemplate(string pathCode)
        {
            var imgPath = Server.MapPath(service.GetTemplatePath(pathCode));
            return base.File(imgPath, "application/unknown");
        }
    

    Solution....

        public ActionResult DownloadAdTemplate(string pathCode)
        {
            var imgPath = Server.MapPath(service.GetTemplatePath(pathCode));
            Response.AddHeader("Content-Disposition", "attachment;filename=DealerAdTemplate.png");
            Response.WriteFile(imgPath);
            Response.End();
            return null;
        }
    
  • Hugo Estrada
    Hugo Estrada over 13 years
    Thanks. The content type was needed to force the download as a file.
  • tierrarara
    tierrarara over 4 years
    content-type is a good solution, content disposition work too, but you can get some risk, exist another post about it stackoverflow.com/a/1012461/2062838
  • jokab
    jokab over 3 years
    hey, me too! it turns out, we just needed to remove the filename so that your code will look like: return File(data, contentType)