web-dev-qa-db-ja.com

ブラウザに表示するのではなく、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;
    }
35
RSolberg

これはcontent-dispositionヘッダーで制御できると思います。

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

応答に次のヘッダーを設定する必要があります。

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

逆の効果を探していたので、実際にここに来ました。

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

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);
    }
3
Iain M Norman

あなたのケースでファイルをダウンロードする正しい方法は、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;
}
1
Developer

これは実際に@ 7072k3

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

私の作業コードからそれをコピーしました。これでも、標準のActionResult戻り値型が使用されます。

1
user714055