ブラウザウィンドウに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;
}
これはcontent-dispositionヘッダーで制御できると思います。
Response.AddHeader(
"Content-Disposition", "attachment; filename=\"filenamehere.png\"");
応答に次のヘッダーを設定する必要があります。
Content-Disposition: attachment; filename="myfile.png"
Content-Type: application/force-download
逆の効果を探していたので、実際にここに来ました。
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");
}
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);
}
あなたのケースでファイルをダウンロードする正しい方法は、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;
}
これは実際に@ 7072k3
var result = File(path, mimeType, fileName);
Response.ContentType = mimeType;
Response.AddHeader("Content-Disposition", "inline");
return result;
私の作業コードからそれをコピーしました。これでも、標準のActionResult戻り値型が使用されます。