判断用户上传文件的合法性仅仅通过后缀名是完全不够的,谁也不知道后缀名是否被更改,服务器保存一个不知道真实类型的文件有极大的风险。
因此需要后台进行进一步的文件类型校验,这里有两种情况:
1)一般的文件类型例如:jpg、png、xlsx等等是有固定文件头的,提取出用户上传文件的文件头与固定文件头进行对比,就可以得到文件的准确类型。
2)文本文件:txt、csv等等。文本文件具有特殊性,文本头无明显标志。但是文本文件百分百具有业务特殊性。可以在对文本进行格式验证时,判断是否为目标类型;或者通过编码校验,看文本是否正确编码,是否有乱码存在(正确编辑的文件,不可能存在乱码),有第三方插件cpdetector可以检测当前文件的编码;最后还可以通过提供文件模板,固定文本文件的头尾等方式来进行校验。
这里主要说明第一种情况,第二种文本情况根据业务具体环境不同,有不同的处理方式。
文件类型枚举?
package com.uti.utilEnum; public enum FileTypeEnum { JPG("ffd8ffe000104a464946"), PNG("89504e470d0a1a0a0000"), GIF("47494638396126026f01"), TIF("49492a00227105008037"), BMP_1("424d228c010000000000"),//16色位图(bmp) BMP_2("424d8240090000000000"),//24位位图(bmp) BMP_3("424d8e1b030000000000"),//256色位图(bmp) DWG("41433130313500000000"), HTML("3c21444f435459504520"), HTM("3c21646f637479706520"), CSS("48544d4c207b0d0a0942"