我有一个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不允许文件名中包含特殊字符。
答案 0 :(得分:3)
您根本无法依赖浏览器提交可用的MIME媒体类型。客户端计算机可能没有为特定文件类型设置任何媒体类型信息(这可能是TIFF的情况),或者它可能根本不支持发送媒体类型,或者可能存在错误(因为已经存在)过去用IE)。
您也不能依赖浏览器提交可用的文件扩展名。客户端计算机可能不使用文件扩展名来确定文件的类型。 (事实上,Mac和现代Linux使用多种机制来确定类型,因此任何文件扩展名都可能具有误导性,如果存在的话。)
就此而言,您甚至无法依靠浏览器首先提交可用的文件名!并非每个操作系统都使用反斜杠字符和点作为目录和扩展分隔符;提交的文件名实际上是一个不透明的字符串,您可以用它来猜测一些常见的情况,但您不能认为是明确的。
因此,确定上传文件类型的唯一合理方法是:
明确询问用户他们上传的是哪种类型。
尝试猜测媒体类型和尾随文件名的类型,然后回过头来询问用户它的类型。
如果您要允许的类型都是具有可嗅探头的类型(如TIFF和大多数其他图像格式),您可以通过查看文件内容来计算出类型。
< / LI> 醇>答案 1 :(得分:2)
使用System.IO命名空间中的函数来解析它。
要获得扩展程序,您可以这样做:
fileExtension = System.IO.Path.GetExtension(filUpload.PostedFile.FileName);
答案 2 :(得分:1)
我相信用户的浏览器会随文件一起发送声明的MIME类型。然后由浏览器声明文件的类型。不同的浏览器可能具有从文件中推断出最佳MIME类型的不同能力。当您在服务器上获得该文件时,您可能只是检查.tif [f]扩展名 - 这可能是上传浏览器将要执行的所有检查。