当前位置:网站首页>使用tika 判断文件类型
使用tika 判断文件类型
2022-07-26 22:40:00 【成大事啊】
判断文件类型一般可采用两种方式
后缀名判断
简单易操作,但无法准确判断类型
文件头信息判断
通常可以判断文件类型,但有些文件类型无法判断(如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。所以还是有问题。希望能解决的大佬可以帮忙指正修改一下。
边栏推荐
- [HFCTF2020]EasyLogin
- 当事务遇上分布式锁
- JSCORE day_ 04(7.5)
- Deep understanding of golang - closures
- Neo4j基础指南(安装,节点和关系数据导入,数据查询)
- Flink1.11 intervalJoin watermark生成,状态清理机制源码理解&Demo分析
- Spark源码学习——Memory Tuning(内存调优)
- 14 web vulnerability: types of SQL injection and submission injection
- [CTF攻防世界] WEB区 关于备份的题目
- Rational selection of (Spark Tuning ~) operator
猜你喜欢
![[NPUCTF2020]ezinclude](/img/24/ee1a6d49a74ce09ec721c1a3b5dce4.png)
[NPUCTF2020]ezinclude
![[b01lers2020]Welcome to Earth](/img/e7/c8c0427b95022fbdf7bf2128c469c0.png)
[b01lers2020]Welcome to Earth

VMware Workstation 虚拟机启动就直接蓝屏重启问题解决

基于Flink实时项目:用户行为分析(二:实时流量统计)
![[RootersCTF2019]I_< 3_ Flask](/img/69/1c77e45e939cf86bb75be8a6c42574.png)
[RootersCTF2019]I_< 3_ Flask

flink需求之—SideOutPut(侧输出流的应用:将温度大于30℃的输出到主流,低于30℃的输出到侧流)

MySQL8.0中的隐藏索引和降序索引(新特性)
![[BJDCTF2020]EzPHP](/img/be/a48a1a9147f1f3b21ef2d60fc1f59f.png)
[BJDCTF2020]EzPHP

基于Flink实时项目:用户行为分析(三:网站总浏览量统计(PV))
![[CISCN2019 华北赛区 Day1 Web2]ikun](/img/80/53f8253a80a80931ff56f4e684839e.png)
[CISCN2019 华北赛区 Day1 Web2]ikun
随机推荐
当事务遇上分布式锁
2022.7.18DAY608
[HITCON 2017]SSRFme
ES6中的export和import
Application of encoding in XSS
C # conversion of basic data types for entry
js中this指向详解
Solve the problem that there is no ado.net entity data model in vs
重学JSON.stringify
select查询题目练习
2022.DAY599
Flink1.11 多并行度watermark测试
Only hard work, hard work and hard work are the only way out C - patient entity class
[WUSTCTF2020]CV Maker
MySQL索引优化:哪些情况下需要建立索引(适合构建索引的几种情况)
[CTF攻防世界] WEB区 关于Cookie的题目
MySQL - how to determine a field suitable for building an index?
Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=
基于Flink实时计算Demo—关于用户行为的数据分析
[红明谷CTF 2021]write_shell