我有一个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不允许在文件名中的特殊字符。
你根本无法依靠浏览器提交一个可用的MIME媒体类型。 客户机可能没有设置为特定文件类型任何媒体类型的信息(这可能为TIFF这里的情况),或者它可能不支持发送的媒体类型,在所有的,或者有可能是在它的错误(因为已经有与IE过去)。
您也可以不依赖于浏览器提交一个可用的文件扩展名。 客户机可能不使用文件扩展名来确定文件的类型。 (事实上,Mac和现代的Linux使用多种机制来确定类型,所以任何文件扩展名可能会产生误导,如果存在的话都没有。)
对于这个问题,你甚至不能依靠浏览器首先提交一个可用的文件名! 并不是每一个操作系统使用反斜杠字符和点的目录和扩展分隔符; 提交的文件名实际上是一个不透明的字符串,你可以使用猜测一些常见的情况,但你不能认为是明确的。
因此,唯一合理的方法来确定一个上传的文件类型有:
请用户明确他们上传什么类型。
试着猜测什么类型可能是从媒体类型和结尾的文件名,回落至问它是什么类型的用户。
如果你想允许类型与sniffable头所有的人(如TIFF和大多数其他的图像格式),可以通过查看文件的内容制定出的类型。
在System.IO命名空间的使用功能解析出来代替。
为了得到扩展,你可以这样做:
fileExtension = System.IO.Path.GetExtension(filUpload.PostedFile.FileName);
我认为,用户的浏览器和文件一起发出声明MIME类型。 它然后由浏览器申报文件的类型。 不同的浏览器可能不得不从文件推断出最好的MIME类型不同的能力。 当您在服务器上的文件,你可能只是检查了的.tif [F]的扩展 - 这可能是所有的检查上载浏览器会做反正。