Java文件类型校验之Apache Tika

一、背景

判断文件类型一般可采用两种方式
1、后缀名判断
简单易操作,但无法准确判断类型

2、文件头信息判断
通常可以判断文件类型,但有些文件类型无法判断(如word和excel头信息的前几个字节是一样的, 无法判断)

使用apache.tika可轻松解决以上两种方式存在的问题

二、Tika介绍

Apachhe Tika是基于java的内容检测和分析的工具包,可检测并提取来自上千种不同文件类型(如PPT,XLS和PDF)中的元数据和结构化文本。

三、使用方法

Maven工程中引入依赖

<dependency>
    <groupId>org.apache.tikagroupId>
    <artifactId>tika-coreartifactId>
    <version>1.24.1version>
dependency>

注意tika-core和tika-parsers的区别,我这里导入的是tika-core

工具类(可现用)

使用示例
String fileName = multipartFile.getOriginalFilename();
FileTypeCheck.getFileTypeByFileName(fileName,multipartFile);
@Slf4j
public class FileTypeCheck {

    public static void getFileTypeByFileName(final String fileName, MultipartFile mFile) {
        Tika defaultTika = new Tika();
        String fileType;
        final File file = new File(fileName);
        try {
            FileUtils.copyInputStreamToFile(mFile.getInputStream(), file);
            fileType = defaultTika.detect(file);
            if (!FileTypeContant.FILE_TYPE_XLS.equals(fileType) && !FileTypeContant.FILE_TYPE_XLSX.equals(fileType)
                    && !FileTypeContant.FILE_TYPE_DOC.equals(fileType) && !FileTypeContant.FILE_TYPE_DOCX.equals(fileType) && !FileTypeContant.FILE_TYPE_PDF.equals(fileType)
                    && !FileTypeContant.FILE_TYPE_JSON.equals(fileType) && !FileTypeContant.FILE_TYPE_XML.equals(fileType)
                    && !FileTypeContant.FILE_TYPE_SVG.equals(fileType) && !FileTypeContant.FILE_TYPE_PNG.equals(fileType)) {
                throw new ZTBusinessException("请上传正确的文件类型!!!");
            }
        } catch (IOException e) {
            log.error("getFileTypeByFileName exception:", e);
        } finally {
            if (file.exists()) {
                file.delete();
            }
        }
    }

}
public class FileTypeContant {

    public static final String FILE_TYPE_XLS = "application/vnd.ms-excel";
    public static final String FILE_TYPE_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    public static final String FILE_TYPE_DOC = "application/msword";
    public static final String FILE_TYPE_DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
    public static final String FILE_TYPE_PDF = "application/pdf";
    public static final String FILE_TYPE_JSON = "application/json";
    public static final String FILE_TYPE_XML = "application/xml";
    public static final String FILE_TYPE_PNG = "image/png";
    public static final String FILE_TYPE_SVG = "image/svg";

}

四、MultipartFile类转File类

其中,前端传过来的是MultipartFile类,所以后端要转换为File类,转换方法为

//MultipartFile转File
File file = new File(path); 
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);  
 
/*其中File可以
  File file = new File(mFile.getOriginalFilename());
  这是保存在了工程路径下,用完要删除
  file.delete();
*/
 
 
//File转MultipartFile
File file = new File("src/test/resources/input.txt");
FileInputStream input = new FileInputStream(file);
MultipartFile multipartFile =new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input));

五、常见文件类型

MimeType 文件类型
application/msword word(.doc)
application/vnd.ms-powerpoint powerpoint(.ppt)
application/vnd.ms-excel excel(.xls)
application/vnd.openxmlformats-officedocument.wordprocessingml.document word(.docx)
application/vnd.openxmlformats-officedocument.presentationml.presentation powerpoint(.pptx)
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet excel(.xlsx)
application/x-rar-compressed rar
application/zip zip
application/pdf pdf
video/* 视频文件
image/* 图片文件
text/plain 纯文本
text/css css文件
text/html html文件
text/x-java-source java源代码
text/x-csrc c源代码
text/x-c++src c++源代码

六、参考

Tika官网
Tika教程
Tika:一个强大的Java文档内容解析工具
Apache Tika实战
常用文件的mime和mimetype的对应关系

你可能感兴趣的:(java)