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

Apache Tika 是什么?

  • Apache Tika用于文件类型检测和从各种格式的文件内容提取的库。
    在内部,Tika使用现有的各种文件解析器和文档类型的检测技术来检测和提取数据。
  • 使用Tika,人们可以开发出通用型检测器和内容提取到的不同类型的文件,如电子表格,文本文件,图像,PDF文件甚至多媒体输入格式,在一定程度上提取结构化文本以及元数据。
  • Tika提供用于解析不同文件格式的一个通用API。它采用83个现有的专业解析器库,为每个文档类型。
  • 所有这些解析器库是根据一个叫做Parser接口单一接口封装。

Tika类型检测

Tika支持MIME所提供的所有互联网媒体文件类型。每当一个文件通过Tika检测到该文件,其文件类型。检测的介质类型,Tika内部通过以下机制。

MIME标准

多用途Internet邮件扩展(MIME)标准,用于识别文件类型的最佳标准。这些标准的知识有助于在内部相互作用的浏览器。

当浏览器遇到一个媒体文件,它选择可用它来显示其内容的兼容软件。在情况下,它不具有任何合适的应用程序,以运行一个特定媒体文件,它建议用户获得合适的插件软件。

springboot 中使用

        <!-- 上传文件验证 -->
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>1.9</version>
        </dependency>

文件类型判断工具类

package com.cloudDisk.utils.file;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.HttpHeaders;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaMetadataKeys;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.springframework.web.multipart.MultipartFile;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 * @author 成大事
 * @date 2021-12-20
public class FileTypeJudge {
     * 获取类型
     * @param multipartFile  文件
     * @return mineType
    public static String getMimeTypeFile(MultipartFile multipartFile) throws Exception {
        File file = MultipartFileToFile.multipartFileToFile(multipartFile);
        if (file.isDirectory()) {
            return "the target is a directory";
		 //创建自动检测解析器
        AutoDetectParser parser = new AutoDetectParser();
        parser.setParsers(new HashMap<MediaType, Parser>());
        Metadata metadata = new Metadata();
        metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName());
        InputStream stream;
        try {
            stream = new FileInputStream(file);
            parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
            stream.close();
        } catch (TikaException | SAXException | IOException e) {
            e.printStackTrace();
        //将产生的临时文件删除
        MultipartFileToFile.deleteTempFile(file);
        return metadata.get(HttpHeaders.CONTENT_TYPE);

类型转换工具类

一般情况下,都是通过multipleFile来接收文件。但是tika是判断file 的。所以需要一个工具类将multiplefile转成file

package com.cloudDisk.utils.file;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
 * @author 成大事
 * @since 2022/5/11 10:20
public class MultipartFileToFile {
     * MultipartFile 转 File
     * @param file
     * @throws Exception
    public static File multipartFileToFile(MultipartFile file) throws Exception {
        File toFile = null;
        if (file.equals("") || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(file.getOriginalFilename());
            inputStreamToFile(ins, toFile);
            ins.close();
        return toFile;
    //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
     * 删除本地临时文件
     * @param file
    public static void deleteTempFile(File file) {
        if (file != null) {
            File del = new File(file.toURI());
            del.delete();
 @GetMapping("/testUpload")
    public R testUpload(
            @RequestParam("file") MultipartFile file
    ) throws Exception {
        String mimeType = FileTypeJudge.getMimeTypeFile(file);
        log.info("tika 的格式{}",mimeType);
        return R.ok(mimeType);

使用apiPost 测试发送文件
在这里插入图片描述
查看:
在这里插入图片描述

就是不能直接对multiplefile的类型进行判断,得先转换成file的类型。之前参考的一篇博客

https://blog.csdn.net/weixin_43194885/article/details/109747552

可以实现简单的一些文件的判断。但是比如pptx,word还有xlsx都识别成application/zip。所以还是有问题。希望能解决的大佬可以帮忙指正修改一下。

使用Tika进行文件类型校验 Tika是什么 ​ 我们都知道,普通的文件后缀校验并不能校验出这个文件的类型,大部分的文件类型校验都是通过获取文件的魔数来判断文件的类型,因为对于大多数类型文件来说他的魔数是固定的(例如class文件的魔数就是:CA FE )。所以目前大部分网络上找到的处理方案是将各个文件的魔数放倒Map集合中,然后通过获取文件的魔数,从Map集合查找对应的文件类型。但是同类型的文件的魔数真的都是固定的么?事实上并不是这样的,mp4文件的魔数就不是固定的。那就是意味着,你放了一个mp4的魔数 Tika可以用来提取office、PDF、HTML、txt等常用文件中得文本(在提取文本时,图片是无法提取的,会被丢弃),方便Lucene进行文本的生成索引和检索。 Tika的用法很简单,但是依赖包有些多,导入包后,使用方法如下: package com.johnny.lucene05.lucene_plugin.tika; import java.io.File; import TikaApache的Lucene项目下面的子项目,在lucene的应用中可以使用tika获取大批量文档中的内容来建立索引,非常方便,也很容易使用~ Tika的缺点就是都是依赖外部的jar包,导致jar包的重量太大,lucene的核心包只有1M,tika约20M,tika依 .doc application/msword .dot application/msword .docx application/vnd.openxmlformats-officedocument.wordprocessingml.document .dotx application/vnd.openxmlformats-officedocument.wordprocessingml.template .docm application/vnd.ms-word.documen 使用tika判断文件类型,不会产生临时文件的方法 因为后缀判断文件不安全,所以最近找了找判断文件类型的其他方法,总结就是使用文件后缀和文件头来判断或者基于tika和文件后缀一同来做文件类型判断,本次使用tika的方式来做文件类型判断,至于于配合个文件后缀的方法就不写了不是很难,就自己加上吧动动双手成就未来. 首先是依赖 就去maven repository中搜索tika-core就好了 还有一个tika-parsers咱没弄明白他是做什么的如果有了解的大佬可以评论一下 以下就是我的的代码区别就是因为使用s 文件头信息判断 通常可以判断文件类型,但有些文件类型无法判断(如word和excel头信息的前几个字节是一样的,无法判断使用apache.tika可轻松解决以上两种方式存在的问题使用apache.tika判断文件类型1. maven依赖<!-- https://mvnrepository.com/artifact/o Apache Tika用于文件类型检测和从各种格式的文件中提取文本内容。 Tika使用方式很简单: public void testTikaParseEmlWithDocAttachment() throws TikaException, SAXException, IOException { String filename="eml-with-doc-attachment-test.eml"; AutoDetectParser autoParser try (InputStream is = theInputStream; BufferedInputStream bis = new BufferedInputStream(is);) { AutoDetectParser parser = new AutoDetectParser(); Detector detector = parser.getDetecto... 假设有一批文档,格式有DOC、DOCX、PPT、PPTX、TXT、PDF这几种,实现一个类似百度文库的文件检索系统,需求如下。 (1)能够对文件名进行检索。 (2)能够对文件内容进行检索。 (3)能够下载检索到的文件。 (4)能够实现关键字的高亮。 2、架构设计 概括如下,文件存储系统中存放了不同类型的文件,后台通过程序提取出文件名和文件内容,使用Lucene对文件名和文件内容进行... 我有ms文档包含文本和图像.我想解析它们以获得xml结构.在研究之后,我最终使用apache tika来转换我的文档.我可以将我的doc解析为xml.这是我的代码:AutoDetectParser parser=new AutoDetectParser();InputStream input=new FileInputStream(new File("1.docx"));Metadata meta...