在ASP.NET MVC中将文件返回到View / Download
我遇到了将存储在数据库中的文件发送回ASP.NET MVC中的用户的问题。 我想要的是一个视图列出两个链接,一个查看文件,并让mimetype发送到浏览器决定如何处理,另一个强制下载。
如果我select查看名为SomeRandomFile.bak
的文件,并且浏览器没有关联的程序来打开这种types的文件,那么我没有问题,它的默认下载行为。 但是,如果我select查看一个名为SomeRandomFile.pdf
或SomeRandomFile.jpg
的文件,我只想简单地打开该文件。 但是我也想保留一个下载链接,这样我就可以强制下载提示,不pipe文件types如何。 这有道理吗?
我已经试过FileStreamResult
,它适用于大多数文件,它的构造函数默认不接受文件名,所以未知的文件被分配基于URL的文件名(它不知道基于内容types给出的扩展名)。 如果我通过指定文件名来强制文件名,那么我就失去了浏览器直接打开文件的能力,我得到一个下载提示。 有没有人遇到过这个问题。
这些是我迄今为止所尝试的例子。
//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};
有什么build议么?
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
由于没有在“文档”variables的types提示,我遇到了接受的答案麻烦: 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());
查看文件(例如txt):
return File("~/TextFileInRootDir.txt", MediaTypeNames.Text.Plain);
要下载文件(例如txt):
return File("~/TextFileInRootDir.txt", MediaTypeNames.Text.Plain, "TextFile.txt");
注意:要下载文件,我们应该传递fileDownloadName参数
FileVirtualPath – > Research \ Global Office Review.pdf
public virtual ActionResult GetFile() { return File(FileVirtualPath, "application/force-download", Path.GetFileName(FileVirtualPath)); }
我相信这个答案是更清洁,(基于https://stackoverflow.com/a/3007668/550975 )
public ActionResult GetAttachment(long id) { FileAttachment attachment; using (var db = new TheContext()) { attachment = db.FileAttachments.FirstOrDefault(x => x.Id == id); } return File(attachment.FileData, "application/force-download", Path.GetFileName(attachment.FileName)); }