Java文件类型校验之Apache Tika详解

 更新时间:2026年03月30日 09:47:24   作者:HelloWorddddddd  
本文介绍了使用Apache Tika库来判断文件类型的方法,Tika可判断多种文件类型,包括doc、ppt、xls等,通过引入Tika的Maven依赖,可以轻松转换MultipartFile为File类,从而获取文件的Mime类型,最后列出了常见文件类型的Mime类型,方便使用

一、背景

判断文件类型一般可采用两种方式

1、后缀名判断

简单易操作,但无法准确判断类型

2、文件头信息判断

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

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

二、Tika介绍

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

三、使用方法

Maven工程中引入依赖

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-core</artifactId>
    <version>1.24.1</version>
</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/mswordword(.doc)
application/vnd.ms-powerpointpowerpoint(.ppt)
application/vnd.ms-excelexcel(.xls)
application/vnd.openxmlformats-officedocument.wordprocessingml.documentword(.docx)
application/vnd.openxmlformats-officedocument.presentationml.presentationpowerpoint(.pptx)
application/vnd.openxmlformats-officedocument.spreadsheetml.sheetexcel(.xlsx)
application/x-rar-compressedrar
application/zipzip
application/pdfpdf
video/*视频文件
image/*图片文件
text/plain纯文本
text/csscss文件
text/htmlhtml文件
text/x-java-sourcejava源代码
text/x-csrcc源代码
text/x-c++srcc++源代码

六、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解IDEA2020新建spring项目和c3p0连接池的创建和使用

    详解IDEA2020新建spring项目和c3p0连接池的创建和使用

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,本文就使用Spring实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • java判断空的实现方法

    java判断空的实现方法

    字符串判断空有两种情况:一个是分配了内存但值为空(""),另一个是未分配内存(null),判断方法包括isEmpty()和isBlank(),其中isBlank()还可以过滤空格、制表符,对于列表,判断不为空可以使用list!=null && !list.isEmpty()或list!=null && list.size()>0
    2024-09-09
  • 将SpringBoot项目无缝部署到Tomcat服务器的操作流程

    将SpringBoot项目无缝部署到Tomcat服务器的操作流程

    SpringBoot 是一个用来简化 Spring 应用初始搭建以及开发过程的框架,我们可以通过内置的 Tomcat 容器来轻松地运行我们的应用,本文给大家介绍 SpringBoot 项目部署到独立 Tomcat 服务器的操作流程,需要的朋友可以参考下
    2024-05-05
  • 关于SpringGateway调用服务 接受不到参数问题

    关于SpringGateway调用服务 接受不到参数问题

    这篇文章主要介绍了关于SpringGateway调用服务接受不到参数问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • java实现多人聊天对话室

    java实现多人聊天对话室

    这篇文章主要为大家详细介绍了java实现多人聊天对话室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • java 引用传递的三种类型小结

    java 引用传递的三种类型小结

    这篇文章主要介绍了java 引用传递的三种类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 解决eclipse上传svn忽略target文件夹的坑

    解决eclipse上传svn忽略target文件夹的坑

    这篇文章主要介绍了解决eclipse上传svn忽略target文件夹的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • SpringSecurity安全框架的使用

    SpringSecurity安全框架的使用

    SpringSecurity是一个用于企业应用系统的安全框架,可以控制用户登录权限,实现不同权限用户访问不同内容,文章介绍了SpringSecurity的简单配置和使用,包括环境搭建、测试用例和自定义登录页面的配置
    2025-02-02
  • mybatis中嵌套使用foreach需要注意的坑

    mybatis中嵌套使用foreach需要注意的坑

    在使用MyBatis进行数据库操作时,如果需要在一个大的foreach标签中嵌套另一个foreach,需要注意内层foreach的item属性不能与外层重复,如果出现重复,会导致绑定参数时找不到正确的参数,从而抛出异常
    2024-09-09
  • Struts2开发环境搭建 附简单登录功能实例

    Struts2开发环境搭建 附简单登录功能实例

    这篇文章主要介绍了Struts2开发环境搭建,为大家分享一个简单登录功能实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11

最新评论