在ASP.NET MVC中将文件返回到View / Download
我遇到了将存储在数据库中的文件发送回ASP.NET MVC中的用户的问题。 我想要的是一个视图,列出了两个链接,一个查看文件,并让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};
有什么建议么?
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);
}
注意:上面的示例代码无法正确说明文件名中的国际字符。 有关相关标准,请参阅RFC6266。 我相信最近版本的ASP.Net MVC的File()
方法和ContentDispositionHeaderValue
类正确地解决了这个问题。 - 奥斯卡2016-02-25
由于在“文档”变量中没有类型暗示,我无法接受所接受的答案: var document = ...
所以我发布了什么对我有用,作为别人遇到问题的替代方案。
public ActionResult DownloadFile()
{
string filename = "File.pdf";
string filepath = AppDomain.CurrentDomain.BaseDirectory + "/Path/To/File/" + filename;
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
string contentType = MimeMapping.GetMimeMapping(filepath);
var cd = new System.Net.Mime.ContentDisposition
{
FileName = filename,
Inline = true,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(filedata, contentType);
}
达林季米特洛夫的回答是正确的。 只是一个补充:
Response.AppendHeader("Content-Disposition", cd.ToString());
如果您的响应已经包含“Content-Disposition”标题,则可能会导致浏览器无法呈现文件。 在这种情况下,您可能想要使用:
Response.Headers.Add("Content-Disposition", cd.ToString());
链接地址: http://www.djcxy.com/p/20543.html