我遇到了将存储在数据库中的文件发回给ASP.NET MVC中的用户的问题。我想要的是一个视图,列出了两个链接,一个查看文件,并让mimetype发送给浏览器决定如何处理,另一个强制下载。将文件返回到ASP.NET MVC中的查看/下载
如果我选择查看名为的文件,并且浏览器没有关联的程序来打开这种类型的文件,那么我对它的默认下载行为没有任何问题。但是,如果我选择查看名为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};
有什么建议?
完美的,正是我所寻找的,它的工作方式正是我想要的。我记得过去使用过ContentDisposition,但我并没有意识到它的Inline属性,并且我很好奇是否有更多的MVC集成选项,而不是直接设置标题。但对AppendHeader的简单调用看起来对我来说已经足够优雅了。谢谢您的帮助!! – 2011-04-29 15:51:25
这在任何情况下都不起作用。有些浏览器希望引用文件名(attachment;“downloadfile.pdf”) – tgallard 2011-09-06 15:50:25
如果我没有记错,只要文件名没有空格就可以取消引号(我通过HttpUtility.UrlEncode()运行我的程序来实现此目的)。 – 2012-04-28 11:54:24