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

时间:2009-08-19 17:47:17

标签: asp.net file-upload content-type

我有一个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不允许文件名中包含特殊字符。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

  1. 明确询问用户他们上传的是哪种类型。

  2. 尝试猜测媒体类型和尾随文件名的类型,然后回过头来询问用户它的类型。

  3. 如果您要允许的类型都是具有可嗅探头的类型(如TIFF和大多数其他图像格式),您可以通过查看文件内容来计算出类型。

    < / LI>

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

我相信用户的浏览器会随文件一起发送声明的MIME类型。然后由浏览器声明文件的类型。不同的浏览器可能具有从文件中推断出最佳MIME类型的不同能力。当您在服务器上获得该文件时,您可能只是检查.tif [f]扩展名 - 这可能是上传浏览器将要执行的所有检查。