ASP.NET MVC загружает изображение вместо отображения в браузере

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

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

Решение....

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

Правильный способ загрузки файла в ваш случай - использовать класс FileResult.

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