上传文件时获取不正确的文件扩展名和内容类型

Posted

技术标签:

【中文标题】上传文件时获取不正确的文件扩展名和内容类型【英文标题】:Getting an incorrect file extension and content type when uploading file 【发布时间】:2010-11-21 01:17:16 【问题描述】:

我有一个 asp.net 应用程序,用户可以在其中将文件上传到我们的数据库。

有时当他们上传文件时,content-type 被设置为"application/octet-stream",这是一个二进制文件。

当我问用户时,他们说他们上传了他们说这是一个.tif 文件。不知何故,上传控件将其设置为"application/octet-stream"

当我从我的计算机上传相同的.tif 文件时,它会以正确的内容类型 (application/octet-stream) 上传。

我正在使用以下代码来获取文件扩展名

fileExtension = filUpload.PostedFile.FileName.Substring(filUpload.PostedFile.FileName.LastIndexOf(".") + 1)

有时它会将文件扩展名返回为"c:\documen""j:\testing" 等。我知道Windows 不允许文件名中包含特殊字符。

【问题讨论】:

首先,不要重复造***,使用System.IO.Path.GetExtension获取扩展名 第二,你提到“application/octet-stream”作为正确和不正确的值 【参考方案1】:

使用 System.IO 命名空间中的函数来解析它。

要获得扩展,您可以这样做:

fileExtension = System.IO.Path.GetExtension(filUpload.PostedFile.FileName);

【讨论】:

【参考方案2】:

我相信用户的浏览器会随文件一起发送声明的 MIME 类型。然后由浏览器来声明文件的类型。不同的浏览器可能有不同的能力从文件中推断出最佳的 MIME 类型。当您在服务器上获取文件时,您可能只需检查 .tif[f] 扩展名——这可能就是上传浏览器无论如何都会进行的所有检查。

【讨论】:

问题是上传的文件不需要是.tif文件。可以是pdf、word、文本文件等。【参考方案3】:

您根本不能依赖浏览器来提交可用的 MIME 媒体类型。客户端机器可能没有为特定文件类型设置任何媒体类型信息(这里可能是 TIFF 的情况),或者它可能根本不支持发送媒体类型,或者其中可能存在错误(因为已经过去使用 IE)。

您也不能依赖浏览器来提交可用的文件扩展名。客户端机器可能不使用文件扩展名来确定文件的类型。 (事实上​​,Mac 和现代 Linux 使用多种机制来确定类型,因此任何文件扩展名都可能会产生误导,如果存在的话。)

就此而言,您甚至不能一开始就依赖浏览器来提交可用的文件名!并非每个操作系统都使用反斜杠字符和点作为目录和扩展分隔符;提交的文件名实际上是一个不透明的字符串,您可以使用它来猜测一些常见情况,但您不能认为是确定的。

因此,确定上传文件类型的唯一合理方法是:

    明确询问用户他们正在上传什么类型。

    尝试从媒体类型和尾随文件名猜测它可能是什么类型,然后回退到询问用户它是什么类型。

    如果您要允许的类型都是带有可嗅探标题的类型(如 TIFF 和大多数其他图像格式),您可以通过查看文件的内容来确定类型。

【讨论】:

以上是关于上传文件时获取不正确的文件扩展名和内容类型的主要内容,如果未能解决你的问题,请参考以下文章

通过 Dropbox API 上传的文件内容不一致

获取文件类型不使用文件扩展名 c#

从内容而不是从扩展名中获取文件类型[重复]

PHP 是不是具有在给定有效内容类型的情况下返回正确文件扩展名的函数?

在java中确定文件的实际内容类型[重复]

从扩展生成内容类型标头