在做考勤机的时候,遇到过从浏览器端向后台传输图片的操作,这个操作当时是通过把图片分片,以二进制流的形式传输到后台,然后在后台恢复为源文件。
在上传文件的时候,需要对用户选择的文件类型进行判断,当然,这里最简单的方法莫过于直接判断后缀名即可,只需要读取文件名,然后判断文件的后缀,就可以判断上次文件的类型。
这种方法很容易想到,但是这种方法很不安全,当用户把文件后缀改为可选文件后缀的时候,就会造成恶意上传文件。
那么就要考虑对文件本身进行验证,来确定是否为可选文件,一般对于WEB程序来说,分为前台验证和后台验证了。
当通过前台验证时,如果是使用前台验证时,可以语言本身提供的方法判别MIME类型,比如php文件,可以通过mime_content_type()和Fileinfo函数,也可以使用环境变量$_FILE[filename][‘type’]来识别,不过后者只能识别少数文件类型,是根据文件内容识别的。
然而,很不幸的是,我只能用html+Javascript+CSS来实现我的前台,所以,为了安全起见,只有通过读取文件本身来判断文件的类型,好在图片文件的头部几个字节是统一的,如GIF是61 39 38 46 49 47H,JPG是FF D8 FFH,PNG是47 4E 50 89H等,可以通过读取图片文件的前几个字节来判断文件类型。
后台也可以采用同样的方法验证,即通过读取文件头。当然,也有其他的方法,比如,可以使用MIME解析库等,这里就不赘述了,比如libmime等。