在上传文件时,遇到了一个不正确的文件扩展名和内容类型(Getting an incorrect fi

2019-10-30 05:40发布

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

Answer 1:

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

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

对于这个问题,你甚至不能依靠浏览器首先提交一个可用的文件名! 并不是每一个操作系统使用反斜杠字符和点的目录和扩展分隔符; 提交的文件名实际上是一个不透明的字符串,你可以使用猜测一些常见的情况,但你不能认为是明确的。

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

  1. 请用户明确他们上传什么类型。

  2. 试着猜测什么类型可能是从媒体类型和结尾的文件名,回落至问它是什么类型的用户。

  3. 如果你想允许类型与sniffable头所有的人(如TIFF和大多数其他的图像格式),可以通过查看文件的内容制定出的类型。



Answer 2:

在System.IO命名空间的使用功能解析出来代替。

为了得到扩展,你可以这样做:

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


Answer 3:

我认为,用户的浏览器和文件一起发出声明MIME类型。 它然后由浏览器申报文件的类型。 不同的浏览器可能不得不从文件推断出最好的MIME类型不同的能力。 当您在服务器上的文件,你可能只是检查了的.tif [F]的扩展 - 这可能是所有的检查上载浏览器会做反正。



文章来源: Getting an incorrect file extension and content type when uploading file