我已阅读这个和这个问题,这似乎表明,文件的MIME类型可以使用在客户端的JavaScript进行检查.现在,我知道真正的验证仍然必须在服务器端完成.我想执行客户端检查以避免不必要的服务器资源浪费.
为了测试是否可以在客户端完成,我将JPEG测试文件的扩展名更改为.png并选择要上载的文件.在发送文件之前,我使用javascript控制台查询文件对象:
document.getElementsByTagName('input')[0].files[0];
Run Code Online (Sandbox Code Playgroud)
这是我在Chrome 28.0上获得的:
File {webkitRelativePath:"",lastModifiedDate:Tue Oct 16 2012 10:00:00 GMT + 0000(UTC),name:"test.png",输入:"image/png",大小:500055 ......}
它显示的类型image/png似乎表明检查是基于文件扩展名而不是MIME类型完成的.我尝试了Firefox 22.0,它给了我相同的结果.但是根据W3C规范,应该实现MIME Sniffing.
我是否可以说目前无法使用javascript检查MIME类型?或者我错过了什么?
在PHP网站上,他们建议的唯一真实检查是使用is_uploaded_file()或move_uploaded_file(),在这里.当然,出于各种原因,您通常不希望用户上传任何类型的文件.
因此,我经常使用一些"严格"的mime类型检查.当然这是非常有缺陷的,因为mime类型通常是错误的,用户无法上传他们的文件.伪造和/或改变也很容易.除此之外,每个浏览器和操作系统都以不同的方式处理它们.
另一种方法是检查扩展,当然比mime类型更容易改变.
如果你只想要图像,使用类似的东西getimagesize()会起作用.
那么其他类型的文件呢?PDF,Word文档或Excel文件?甚至是文本文件?
编辑:如果你没有mime_content_type或Fileinfo和系统("file -bi $ uploadedfile")给你错误的文件类型,还有哪些其他选项?