在ASP.NET MVC中将文件返回到View / Download

我遇到了将存储在数据库中的文件发送回ASP.NET MVC中的用户的问题。 我想要的是一个视图列出两个链接,一个查看文件,并让mimetype发送到浏览器决定如何处理,另一个强制下载。

如果我select查看名为SomeRandomFile.bak的文件,并且浏览器没有关联的程序来打开这种types的文件,那么我没有问题,它的默认下载行为。 但是,如果我select查看一个名为SomeRandomFile.pdfSomeRandomFile.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)); }