当前位置:网站首页>基于tika实现对文件类型进行判断
基于tika实现对文件类型进行判断
2022-08-01 07:37:00 【天青色 等烟雨】
基于tika实现对文件类型进行判断
判断文件类型一般可采用两种方式
1. 后缀名判断
简单易操作,但无法准确判断类型
2. 文件头信息判断
通常可以判断文件类型,但有些文件类型无法判断(如word和excel头信息的前几个字节是一样的,无法判断)
使用tika就可轻松解决这两种方式存在的问题
首先要做的就是导入tika的包坐标
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.24.1</version>
</dependency>
具体实现
package hkyxg.education.util;
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.helpers.DefaultHandler;
import java.io.InputStream;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FileTypeUtil {
private static Pattern pattern = Pattern.compile("image/.*");
private static Pattern pattern2 = Pattern.compile("application/pdf");
/**
* 获取类型
* @param file
* @return
*/
public static String getMimeType(MultipartFile file) {
AutoDetectParser parser = new AutoDetectParser();
parser.setParsers(new HashMap<MediaType, Parser>());
Metadata metadata = new Metadata();
metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName());
try (InputStream stream = file.getInputStream()) {
parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
}catch (Exception e){
throw new RuntimeException();
}
return metadata.get(HttpHeaders.CONTENT_TYPE);
}
/**
* 判断是否是图片
* @param file
* @return
*/
public static boolean isImage(MultipartFile file){
String type = getMimeType(file);
System.out.println(type);
//对比对应的文件类型的mime就好了
Matcher m = pattern.matcher(type);
return m.matches();
}
public static boolean isPdf(MultipartFile file){
String type = getMimeType(file);
System.out.println(type);
Matcher m = pattern2.matcher(type);
return m.matches();
}
}
tika是通过文件流来对文件类型进行判断的,与其他两种方式相比更加安全,方法也比较简单。
一些常见的mime type类型
image/bmp
image/x-bitmap
image/x-pixmap
image/jpg
image/png
image/jpeg
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
application/x-rar-compressed
application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
application/zip zip
image/tiff tiff
image/bmp bmp
application/rtf rtf
application/x-tika-ooxml xls
application/x-bplist pdf
application/pdf
application/vnd.ms-word.document.macroenabled.12 docm
image/gif
application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
application/x-tika-msoffice pdf
application/msword
application/x-7z-compressed 7z
application/vnd.ms-xpsdocument xps
边栏推荐
猜你喜欢
Golang: go static file processing
"By sharing" northwestern university life service | | bytes a second interview on three sides by HR
研发过程中的文档管理与工具
VSCode 快捷键及通用插件推荐
爬虫框架 Scrapy 详解
The use of Golang: go template engine
聊一聊ICMP协议以及ping的过程
app 自动化 打开app (二)
Three aspects of Ali: How to solve the problem of MQ message loss, duplication and backlog?
插入排序—直接插入排序和希尔排序
随机推荐
Offer brush questions - 1
电磁兼容简明教程(6)测试项目
爬虫基本原理介绍、实现以及问题解决
小程序通过云函数操作数据库【使用get取数据库】
选择排序—直接选择排序和堆排序
GO error handling
pytest接口自动化测试框架 | 跳过测试类
零代码网站开发利器:WordPress
Flink SQL - client, how to deal with the source side and to increase the target, the SQL - client including mapping table and the JOB such as
MVVM project development (commodity management system 1)
How to use Photoshop to composite star trail photos, post-processing method of night sky star trail photos
VoLTE基础学习系列 | 什么是SIP和IMS中的Forking
Json对象和Json字符串的区别
sum of special numbers
22牛客多校1 I. Chiitoitsu (概率dp)
pytest接口自动化测试框架 | parametrize中ids的用法
POJ2421道路建设题解
关于App不同方式更新的测试点归纳
The Bean's life cycle
Explosive 30,000 words, the hardest core丨Mysql knowledge system, complete collection of commands [recommended collection]