c# - 如何在不知道 MIME 类型的情况下在 ASP.NET 中返回 FileResult?

标签 c# asp.net-mvc mime-types

我的 ASP.NET MVC 应用程序有带附件的页面,这些附件可以是许多不同的文件类型。

当用户想要访问他们的附件时,我需要触发 FileResult 并返回我有路径的文件附件。

但是,我没有 MIME 类型的数据库,我也不知道这些文件的 MIME 类型。

处理这个问题的正确方法是什么?有没有一种方法可以返回文件并让框架尝试找出 mimetype?

有什么建议吗?

最佳答案

我这样做的方法是保留一个众所周知的扩展及其 MIME 类型的列表,如果找不到扩展,则只需将其作为 application/octet-stream 返回.原因是此 mime 类型应用于应用程序(例如 exe),浏览器根据安全设置可能允许您将其传递给操作系统,从而打开该文件类型的默认编辑器。顺便说一句,请考虑您可能接受并传输给用户的每种文件的安全隐患。

这是我通常使用的列表:

  <MimeTypes>
  <MimeType Type="application/mac-binhex40" Extensions=".hqx"/>
  <MimeType Type="application/msword" Extensions=".doc;.docx"/>
  <MimeType Type="application/pdf" Extensions=".pdf"/>
  <MimeType Type="application/postscript" Extensions=".ai;.eps;.ps"/>
  <MimeType Type="application/rtf" Extensions=".rtf"/>
  <MimeType Type="application/vnd.ms-excel" 
            Extensions=".xla;.xlc;.xlm;.xls;.xlt;.xlw;.xlsx"/>
  <MimeType Type="application/vnd.ms-outlook" Extensions=".msg"/>
  <MimeType Type="application/vnd.ms-powerpoint" 
            Extensions=".pot;.pps;.ppt;.pptx"/>
  <MimeType Type="application/vnd.ms-works" Extensions=".wcm;.wdb;.wks;.wps"/>
  <MimeType Type="application/x-compress" Extensions=".z"/>
  <MimeType Type="application/x-compressed" Extensions=".tgz"/>
  <MimeType Type="application/x-gzip" Extensions=".gz"/>
  <MimeType Type="application/x-msaccess" Extensions=".mdb"/>
  <MimeType Type="application/x-msmetafile" Extensions=".wmf"/>
  <MimeType Type="application/x-mspublisher" Extensions=".pub"/>
  <MimeType Type="application/x-msschedule" Extensions=".scd"/>
  <MimeType Type="application/x-msterminal" Extensions=".trm"/>
  <MimeType Type="application/x-mswrite" Extensions=".wri"/>
  <MimeType Type="application/x-tar" Extensions=".tar"/>
  <MimeType Type="application/zip" Extensions=".zip"/>
  <MimeType Type="audio/basic" Extensions=".au;.snd"/>
  <MimeType Type="audio/mid" Extensions=".mid;.rmi"/>
  <MimeType Type="audio/mpeg" Extensions=".mp3"/>
  <MimeType Type="audio/x-aiff" Extensions=".aif;.aifc;.aiff"/>
  <MimeType Type="audio/x-pn-realaudio" Extensions=".ra;.ram"/>
  <MimeType Type="audio/x-wav" Extensions=".wav"/>
  <MimeType Type="image/bmp" Extensions=".bmp"/>
  <MimeType Type="image/gif" Extensions=".gif"/>
  <MimeType Type="image/jpeg" Extensions=".jpe;.jpeg;.jpg"/>
  <MimeType Type="image/pipeg" Extensions=".jfif"/>
  <MimeType Type="image/tiff" Extensions=".tif;.tiff"/>
  <!--Substitute the following two for text/plain if you're sure bad html
  won't get rendered in the browser-->
  <!--<MimeType Type="text/html" Extensions=".mht;.html;.htm"/>-->
  <!--<MimeType Type="text/plain" Extensions=".txt"/>-->
  <MimeType Type="text/plain" Extensions=".txt;.html;.htm"/>
  <MimeType Type="text/richtext" Extensions=".rtx"/>
  <MimeType Type="text/tab-separated-values" Extensions=".tsv"/>
  <MimeType Type="video/mpeg" Extensions=".mp2;.mpa;.mpe;.mpeg;.mpg;.mpv2"/>
  <MimeType Type="video/quicktime" Extensions=".mov;.qt"/>
  <MimeType Type="video/x-la-asf" Extensions=".lsf;.lsx;.asf;.asr;.asx;"/>
  <MimeType Type="video/x-msvideo" Extensions=".avi"/>
  </MimeTypes>

这是一个如何使用它的示例(类似 C# 的伪代码)。

public string GetMimeType(string ext)
{
  // who would load the file on every method call?  That's just dumb
  var mimes = XElement.Load("MyMimeTypesLolKThx.xml");
  var result = from x in mimes.Elements() 
               where Contains(x, ext) 
               select x.Attribute("Type");
  return result.FirstOrDefault() ?? "application/octet-stream";
}

public bool Contains(XElement el, string ext)
{
  return el.Attribute("Extensions").Value.Contains(ext);  
}

关于c# - 如何在不知道 MIME 类型的情况下在 ASP.NET 中返回 FileResult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2008185/

相关文章:

c# - 旋转绘图时的工件

c# - 在 Entity Framework Core 中添加数据库后子模型列表为空

asp.net-mvc - MVC 中的数字/日期转换助手,在哪里使用它们?

asp.net-mvc - 使用jquery检查POST是否成功

javascript - 脚本被解释为样式表,但以 MIME 类型 text/html 传输

f4v 的 HTML5 MIME 类型

c# - 在 Controller 之外使用 HttpContext - 不好的做法?

c# - 在 Visual Studio 2013 的应用程序中运行应用程序?

html - MVC Gridview 排序箭头改变颜色

mime-types - Apple iWork Mime 类型