MP4内容类型在不同的浏览器中作为不同的MIME类型返回

时间:2011-07-15 20:58:01

标签: c# asp.net mime-types content-type mime

我有一个使用C#为后端构建的ASP.NET应用程序。我有一个上传pdf并检查MIME类型application / pdf的表单,以验证它是否是有效文件。我需要在单独的表格上为MP4文件执行此操作,但它似乎不起作用。它总是返回false。我检查了webkit中返回的MIME类型FileUpload.PostedFile.ContentType,它非常准确。然而,Firefox 5和IE 8分别测试了text / csv和application / octet-stream。这对我来说完全没有意义。我还尝试将扩展名映射到web.config文件中的正确MIME类型,如下所示:

<staticContent>
  <mimeMap fileExtension=".mp4" mimeType="video/mp4" />
  <mimeMap fileExtension=".m4v" mimeType="video/m4v" />
  <mimeMap fileExtension=".ogg" mimeType="video/ogg" />
  <mimeMap fileExtension=".ogv" mimeType="video/ogg" />
  <mimeMap fileExtension=".webm" mimeType="video/webm" />
</staticContent>

在后端CS文件中,我用它来测试发布文件的内容类型:

if (file.PostedFile.ContentType == "video/mp4" || 
    file.PostedFile.ContentType == "video/mpeg" || 
    file.PostedFile.ContentType == "video/ogg" || 
    file.PostedFile.ContentType == "video/quicktime" || 
    file.PostedFile.ContentType == "video/webm") 
        return true;
else
        return false;

另请注意我使用VS附带的本地开发服务器

1 个答案:

答案 0 :(得分:4)

客户端是浏览器,用于确定发送到服务器的内容类型。也就是说,浏览器会发送ASP.NET用来填充HttpPostedFile.ContentType属性的标头。

您无法使用IIS staticContent mime mappings 更改此设置,这些设置仅适用于服务器发送到客户端的文件(不是相反)。

您最好在您发布的if-else块之前使用c#方法中的某些自定义代码,以(尝试)确定真实 mime键入服务器端检查。 看看这两种导致不同结果和性能的方法:

  1. Use reflection to call to a method in a internal .NET framework class(这只是将文件扩展名与框架本身已知的文件扩展名匹配)
  2. Use an un-managed call to a IE dll(此方法应该猜测mime类型在文件中查找 magic bytes as you can read in the MSDN documentation
  3. 注意:一般来说,您应该始终检查/确定服务器上的内容类型,而不要依赖客户端发送的内容类型(永远不要信任HttpPostedFile.ContentType):它可能是意外错误的(就像发生在你身上一样) ),由于浏览器不符合某些标准(IE已知会为某些图像格式发送错误的mime类型)而故意被一些hacky用户改变,错误...