在ASP.NETMVC中返回要查看/下载的文件我在将存储在数据库中的文件发送回ASP.NETMVC中的用户时遇到了问题。我想要的是一个列出两个链接的视图,一个是查看文件并让发送到浏览器的mimetype决定如何处理它,另一个是强制下载。如果我选择查看一个名为SomeRandomFile.bak而且浏览器没有一个相关的程序来打开这种类型的文件,那么我对它默认的下载行为没有问题。但是,如果我选择查看一个名为SomeRandomFile.pdf或SomeRandomFile.jpg我想简单地打开文件。但是我也希望将下载链接保持在一边,这样无论文件类型如何,我都可以强制下载提示符。这有道理吗?我试过了FileStreamResult它适用于大多数文件,默认情况下,它的构造函数不接受文件名,因此未知文件根据url(它不知道要根据内容类型提供的扩展名)分配文件名。如果我通过指定文件名来强制文件名,我就失去了浏览器直接打开文件的能力,并得到了下载提示。有没有其他人遇到过这种情况。这些就是我迄今为止尝试过的例子。//Gives me a download prompt.return File(document.Data, document.ContentType, document.Name);//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)return new FileStreamResult
(new MemoryStream(document.Data), document.ContentType);//Gives me a download prompt (lose the ability to open by default if known type)return new FileStreamResult(new MemoryStream(document.Data),
document.ContentType) {FileDownloadName = document.Name};有什么建议吗?最新情况:这个问题似乎引起了很多人的共鸣,所以我想我应该发布一个更新。Oskar添加的关于国际字符的公认答案的警告是完全有效的,由于使用了ContentDisposition班级,等级。从那以后,我更新了我的实现来修复这个问题。虽然下面的代码是我最近在ASP.NETCore(完整框架)应用程序中出现的这个问题的代码,但它也应该在旧的MVC应用程序中进行最小的更改,因为我使用的是System.Net.Http.Headers.ContentDispositionHeaderValue班级,等级。using System.Net.Http.Headers;public IActionResult Download(){
Document document = ... //Obtain document from database context
//"attachment" means always prompt the user to download
//"inline" means let the browser try and handle it
var cd = new ContentDispositionHeaderValue("attachment")
{
FileNameStar = document.FileName
};
Response.Headers.Add(HeaderNames.ContentDisposition, cd.ToString());
return File(document.Data, document.ContentType);}// an entity class for the document in my database public class Document{
public string FileName { get; set; }
public string ContentType { get; set; }
public byte[] Data { get; set; }
//Other properties left out for brevity}
3 回答
幕布斯6054654
TA贡献1876条经验 获得超7个赞
public ActionResult Download(){ var document = ... var cd = new System.Net.Mime.ContentDisposition { // for example foo.bak FileName = document.FileName, // always prompt the user for downloading, set to true if you want // the browser to try to show the file inline Inline = false, }; Response.AppendHeader("Content-Disposition", cd.ToString()); return File(document.Data, document.ContentType);}
注:File()
ContentDispositionHeaderValue
慕无忌1623718
TA贡献1744条经验 获得超4个赞
Response.AppendHeader("Content-Disposition", cd.ToString());
Response.Headers.Add("Content-Disposition", cd.ToString());
- 3 回答
- 0 关注
- 1320 浏览
添加回答
举报
0/150
提交
取消