叙述
检测文件类型靠读取后缀名的做法,是极度不安全可靠的。后缀名是可以任意修改的,很容易识别错误。
我们使用Apache Tika来解析每个文件的文件头信息,返回具体的特征码,与映射表进行比对,就能知道文件的真实类型。
解决方案
代码只是项目的一部分,只供参考
具体的操作如下:
public class FileUtil {
/**
* Apache Tika 利用现有的解析类库,从不同格式的文档中(例如HTML, PDF, Doc),侦测和提取出元数据和结构化内容
*/
public synchronized static String getFileHeader(byte[] byteMerger) {
Tika tika = new Tika();
return tika.detect(byteMerger);
}
}
这里返回的就是一个特征码。
预先维护一个解析特征码的MAP,把工具类返回的特征码丢进去,捞出具体的真实后缀名。
// 缓存文件头信息-文件头信息
private final HashMap<String, String> fileTypes = new HashMap<>();
private FileService() {
fileTypes.put("image/jpeg", "jpeg");
fileTypes.put("image/png", "png");
fileTypes.put("video/mp4", "mp4");
fileTypes.put("video/quicktime", "mp4");
fileTypes.put("application/zip", "xlsx");//application/vnd.ms-excel xls
}
左侧Key是特征码,右侧Value是真实的后缀名。
常用文件的mime和mimetype的对应关系
“image/jpeg” “jpg”
“image/jpeg” “jpeg”
“image/png” “png”
“image/webp” “webp”
“application/vnd.ms-excel” “xls”
“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet” “xlsx”
“application/msword” “doc”
“application/vnd.openxmlformats-officedocument.wordprocessingml.document” “docx”
“application/vnd.openxmlformats-officedocument.presentationml.presentation” “pptx”
“application/vnd.ms-powerpoint” “ppt”
“application/pdf” “pdf”