我不想在浏览器窗口中显示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;
}
答案 0 :(得分:42)
我相信您可以使用content-disposition标头来控制它。
Response.AddHeader(
"Content-Disposition", "attachment; filename=\"filenamehere.png\"");
答案 1 :(得分:9)
您需要在响应中设置以下标题:
Content-Disposition: attachment; filename="myfile.png"
Content-Type: application/force-download
答案 2 :(得分:5)
我实际上来到这里是因为我正在寻找相反的效果。
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 :(得分:3)
使用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);
}
答案 4 :(得分:1)
这我实际上是@ 7072k3
var result = File(path, mimeType, fileName);
Response.ContentType = mimeType;
Response.AddHeader("Content-Disposition", "inline");
return result;
从我的工作代码复制。 这仍然使用标准的ActionResult返回类型。
答案 5 :(得分:1)
在您的情况下下载文件的正确方法是使用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;
}