使用tika 判断文件类型

2023-11-06

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

后缀名判断

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

文件头信息判断

通常可以判断文件类型,但有些文件类型无法判断(如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。所以还是有问题。希望能解决的大佬可以帮忙指正修改一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用tika 判断文件类型 的相关文章

随机推荐

  • 小程序之100推荐:901~1000

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 901 Oyes视频 Oyes视频小程序简介 一个妈妈专属的视频精选 请至极乐小程序商店搜索 Oyes视频 微信扫码即可体验 902 银如意资讯 银如意资讯小程序简介 银如
  • Mysql Server原理简介

    Mysql客户端包括JDBC Navicat sqlyog 只是为了和mysql server建立连接 向mysql server提交sql语句 mysql server组件 第一部分叫连接器 主要承担的功能叫管理连接和验证权限 每次在进行
  • 缓存穿透、缓存击穿、缓存雪崩的问题与解决方案

    缓存概念 在计算器中 高速缓冲存储器是一个硬件或软件组件 其存储数据 以便该数据可以在将来的请求送达更快 存储在缓存中的数据可能是早期计算的结果 也可能是存储在其他位置的数据的副本 一个缓存命中时 所请求的数据在高速缓存中找到 而出现高速缓
  • 还不知道off-heap堆外内存?安排~

    目录 on heap堆内内存是什么 JVM堆内存是如何划分的 JVM堆内存满了后会怎么样 基于堆外内存解决系统GC卡顿问题 今天给大家聊一个很有意思的知识 就是off heap堆外内存 平时出去面试 或者研究一些技术的时候 经常可能会遇到o
  • 一个简单的实习生管理系统

    写了一个简单的实习生管理系统 用于自己复习java后端 由于是复习java为目的 故而这个系统没有用框架 control层基本手写servlet完成 基本的增删改查 级联删除功能均有实现 适合java刚入门的同学阅读 大神们请别见笑 如有错
  • 教你用OpenCV 和 Python实现圆物检测

    点击上方 码农的后花园 选择 星标 公众号 精选文章 第一时间送达 基于python使用OpenCV实现在一张图片中检测出圆形 并且根据圆检测结果信息 绘制 标记出圆的边界和圆心 1 HoughCircles 霍夫圆检测函数 在Opencv
  • 告诉你个秘密(ISCCCTF)(Crypto--bugku)

    观察一下 有A E B 没有其他字母 猜测是十六进制转字符 还是字符串 有大写 小写 数字 猜测还有加密 然后各种解密都尝试一下 emem 是base64 四个一组 三个一组 哈哈 键盘密码 对的 就是键盘加密 被包围的字母就是flag 提
  • 最常用激活函数公式(更新中)

    最常用激活函数公式 如需转载 请务必标明出处及作者信息 洋石灰儿 https blog csdn net Yshihui article details 80540070 1 what and why 直观的作用就是进行非线性操作 将输入信
  • Linux服务器clang-13安装(环境变量配置)

    1 从llvm的github网址选择合适的release合适的运行平台进行下载 下载官方预编译的二进制压缩包 2 将下载好的压缩包进行本地上传 使用scp命令进行上传 scp r P 端口号 本地文件路径 服务器ID等 服务器上目标地址 3
  • 九大内置对象

    1 request对象 request 对象是 javax servlet httpServletRequest类型的对象 该对象代表了客户端的请求信息 主要用于接受通过HTTP协议传送到服务器的数据 包括头信息 系统信息 请求方式以及请求
  • Fastadmin,配置SMTP邮件,踩坑笔记

    phpmailer php做发送邮件 有个叫phpmailer的插件 而fastadmin正是用的这一插件 首先是准备工作 你要把你的qq邮箱设置一下开启SMTP邮件 qq邮箱的设置位置在 账户 账户 这一选项下 这里如果你手机绑定了qq安
  • web服务器性能 测试,主流web服务器性能测试

    前言 因为boss要一个并发能上W得平台 而且还是要PHP得 恩 好吧 我是不喜欢php的 但是没办法 谁叫PHP是世界上最好得语言呢 于是心血来潮 来了一组 web服务器性能测试 测试有 php7 fpm docker nginx jav
  • 【华为OD机试真题 Java】小组卡片最大数字(100%通过+全网最详细注释)

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • win10开始菜单打不开,使用startmenu.diagcab进行修复

    win10开始菜单打不开 使用startmenu diagcab进行修复 下载后打开运行startmenu diagcab 打开后 点击高级选项 勾选自动修复应用措施 接着点击下一步 运行修复后点击查看详细信息 查看打不开的原因 进行下一步
  • hk pic.net forum.php,HC-SR04 problem with pic18f24k22.

    2021 03 26 00 11 57 proestpa Hello I have a problem with HCSR04 ultrasonic distance sensor I wrote a code that works per
  • 记一次蓝屏的解决,错误代码IRQL_NOT_LESS_OR_EQUAL

    这两天不知为何 电脑总是正在运行时自动重启 今天忍无可忍 百度了一下解决方法 有方法说 我的电脑右键 属性 高级 启动和故障恢复 中的设置 系统失败 中取消勾选 自动重新启动 能解决问题 所以就先照做了 如下图 不设置还好 没想到一设置 重
  • 2021蒙城高考成绩查询,2021亳州高考成绩查询入口

    今年的高考已经和大家告一段落 想必考生和家长们现在比较关注的就是高考成绩查询了 下面出国留学网小编给大家分享 2021亳州高考成绩查询入口 仅供参考 希望帮助各位考生便捷查询高考成绩 祝大家考个好成绩 2021安徽高考成绩查询时间 2021
  • cmd命令安装python第三方库_Python如何安装第三方库

    Python如何安装第三方库 版权申明 非商业目的注明出处可自由转载 博文地址 https blog csdn net cdpxc article details 108808780 出自 cdpxc 注 笔者是在D盘直接安装了Anacon
  • VAE,变分

    1 Latent Variable Model 生成模型一般会生成多个种类的数据 比如说在手写数字生成中 我们总共有10个类别的数字要生成 这个时候latent variable model就是一个很好的选择 为什么呢 举例来说 我们很容易
  • 使用tika 判断文件类型

    判断文件类型一般可采用两种方式 后缀名判断 简单易操作 但无法准确判断类型 文件头信息判断 通常可以判断文件类型 但有些文件类型无法判断 如word和excel头信息的前几个字节是一样的 无法判断 Apache Tika 是什么 Apach