当前位置:网站首页>基于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模版引擎的使用
nodetype中值1、2、3分别代表什么意思
【MySQL】操作表DML相关语句
VSCode插件推荐(Rust环境)
Json对象和Json字符串的区别
How to use Photoshop to composite star trail photos, post-processing method of night sky star trail photos
22牛客多校1 C.Grab the Seat (几何 + 暴力)
【手撕AHB-APB Bridge】~ AHB地址总线的低两位为什么不用来表示地址呢?
Dbeaver connect the MySQL database and error Connection refusedconnect processing
第02章 MySQL的数据目录【1.MySQL架构篇】【MySQL高级】
随机推荐
13 - JUC CountDownLatch concurrent programming
并发编程13-JUC之CountDownLatch
Golang:go获取url和表单属性值
Explosive 30,000 words, the hardest core丨Mysql knowledge system, complete collection of commands [recommended collection]
力扣每日一题-第44天-290. 单词规律
华为深度学习课程第六、七章
NIO programming
pytest接口自动化测试框架 | 跳过测试类
05-SDRAM: Arbitration
日志导致线程Block的这些坑,你不得不防
The log causes these pits in the thread block, you have to prevent
阿里三面:MQ 消息丢失、重复、积压问题,该如何解决?
Image lossless compression software which works: try completely free JPG - C image batch finishing compression reduces weight tools | latest JPG batch dressing tools download
Create, modify and delete tables
mysql中添加字段的相关问题
pytest接口自动化测试框架 | parametrize源码解析
pytest接口自动化测试框架 | 执行失败跳转pdb
支付宝如何生成及配置公钥证书
研发过程中的文档管理与工具
Self-made a remote control software - VeryControl