ASP.NET MVC загружать изображение, а не отображать в браузере - PullRequest
35 голосов
/ 09 июня 2010

Вместо отображения PNG в окне браузера мне бы хотелось, чтобы результат действия вызывал диалоговое окно загрузки файла (вы знаете, открывать, сохранять как и т. Д.).Я могу заставить это работать с кодом ниже, используя неизвестный тип контента, но пользователь затем должен ввести .png в конце имени файла.Как я могу выполнить это поведение, не заставляя пользователя вводить расширение файла?

    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;
    }

Ответы [ 6 ]

42 голосов
/ 09 июня 2010

Я полагаю, что вы можете контролировать это с помощью заголовка размещения содержимого.

Response.AddHeader(
       "Content-Disposition", "attachment; filename=\"filenamehere.png\""); 
9 голосов
/ 09 июня 2010

Вам необходимо установить следующие заголовки в ответе:

  • Content-Disposition: attachment; filename="myfile.png"
  • Content-Type: application/force-download
5 голосов
/ 28 июня 2012

Я действительно пришел сюда, потому что искал противоположный эффект.

    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");
    }
3 голосов
/ 16 августа 2013

С MVC я использую FileResult и возвращаю 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);
    }
1 голос
/ 09 октября 2014

Правильный способ загрузки файла в вашем случае - использовать 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;
}
1 голос
/ 24 апреля 2013

Это я на самом деле @ 7072k3

var result = File(path, mimeType, fileName);
Response.ContentType = mimeType;
Response.AddHeader("Content-Disposition", "inline");
return result;

Скопировал это из моего рабочего кода.При этом все еще используется стандартный тип возврата ActionResult.

...