Java文件類型校驗(yàn)之Apache Tika詳解
一、背景
判斷文件類型一般可采用兩種方式
1、后綴名判斷
簡(jiǎn)單易操作,但無法準(zhǔn)確判斷類型
2、文件頭信息判斷
通??梢耘袛辔募愋?,但有些文件類型無法判斷(如word和excel頭信息的前幾個(gè)字節(jié)是一樣的, 無法判斷)
使用apache.tika可輕松解決以上兩種方式存在的問題
二、Tika介紹
Apachhe Tika是基于java的內(nèi)容檢測(cè)和分析的工具包,可檢測(cè)并提取來自上千種不同文件類型(如PPT,XLS和PDF)中的元數(shù)據(jù)和結(jié)構(gòu)化文本。
三、使用方法
Maven工程中引入依賴
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.24.1</version>
</dependency>注意tika-core和tika-parsers的區(qū)別,我這里導(dǎo)入的是tika-core
工具類(可現(xiàn)用)
使用示例 String fileName = multipartFile.getOriginalFilename(); FileTypeCheck.getFileTypeByFileName(fileName,multipartFile);
@Slf4j
public class FileTypeCheck {
public static void getFileTypeByFileName(final String fileName, MultipartFile mFile) {
Tika defaultTika = new Tika();
String fileType;
final File file = new File(fileName);
try {
FileUtils.copyInputStreamToFile(mFile.getInputStream(), file);
fileType = defaultTika.detect(file);
if (!FileTypeContant.FILE_TYPE_XLS.equals(fileType) && !FileTypeContant.FILE_TYPE_XLSX.equals(fileType)
&& !FileTypeContant.FILE_TYPE_DOC.equals(fileType) && !FileTypeContant.FILE_TYPE_DOCX.equals(fileType) && !FileTypeContant.FILE_TYPE_PDF.equals(fileType)
&& !FileTypeContant.FILE_TYPE_JSON.equals(fileType) && !FileTypeContant.FILE_TYPE_XML.equals(fileType)
&& !FileTypeContant.FILE_TYPE_SVG.equals(fileType) && !FileTypeContant.FILE_TYPE_PNG.equals(fileType)) {
throw new ZTBusinessException("請(qǐng)上傳正確的文件類型!!!");
}
} catch (IOException e) {
log.error("getFileTypeByFileName exception:", e);
} finally {
if (file.exists()) {
file.delete();
}
}
}
}
public class FileTypeContant {
public static final String FILE_TYPE_XLS = "application/vnd.ms-excel";
public static final String FILE_TYPE_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
public static final String FILE_TYPE_DOC = "application/msword";
public static final String FILE_TYPE_DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
public static final String FILE_TYPE_PDF = "application/pdf";
public static final String FILE_TYPE_JSON = "application/json";
public static final String FILE_TYPE_XML = "application/xml";
public static final String FILE_TYPE_PNG = "image/png";
public static final String FILE_TYPE_SVG = "image/svg";
}
四、MultipartFile類轉(zhuǎn)File類
其中,前端傳過來的是MultipartFile類,所以后端要轉(zhuǎn)換為File類,轉(zhuǎn)換方法為
//MultipartFile轉(zhuǎn)File
File file = new File(path);
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
/*其中File可以
File file = new File(mFile.getOriginalFilename());
這是保存在了工程路徑下,用完要?jiǎng)h除
file.delete();
*/
//File轉(zhuǎn)MultipartFile
File file = new File("src/test/resources/input.txt");
FileInputStream input = new FileInputStream(file);
MultipartFile multipartFile =new MockMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input));
五、常見文件類型
| MimeType | 文件類型 |
|---|---|
| application/msword | word(.doc) |
| application/vnd.ms-powerpoint | powerpoint(.ppt) |
| application/vnd.ms-excel | excel(.xls) |
| application/vnd.openxmlformats-officedocument.wordprocessingml.document | word(.docx) |
| application/vnd.openxmlformats-officedocument.presentationml.presentation | powerpoint(.pptx) |
| application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | excel(.xlsx) |
| application/x-rar-compressed | rar |
| application/zip | zip |
| application/pdf | |
| video/* | 視頻文件 |
| image/* | 圖片文件 |
| text/plain | 純文本 |
| text/css | css文件 |
| text/html | html文件 |
| text/x-java-source | java源代碼 |
| text/x-csrc | c源代碼 |
| text/x-c++src | c++源代碼 |
六、總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解IDEA2020新建spring項(xiàng)目和c3p0連接池的創(chuàng)建和使用
C3P0是一個(gè)開源的JDBC連接池,它實(shí)現(xiàn)了數(shù)據(jù)源和JNDI綁定,本文就使用Spring實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
將SpringBoot項(xiàng)目無縫部署到Tomcat服務(wù)器的操作流程
SpringBoot 是一個(gè)用來簡(jiǎn)化 Spring 應(yīng)用初始搭建以及開發(fā)過程的框架,我們可以通過內(nèi)置的 Tomcat 容器來輕松地運(yùn)行我們的應(yīng)用,本文給大家介紹 SpringBoot 項(xiàng)目部署到獨(dú)立 Tomcat 服務(wù)器的操作流程,需要的朋友可以參考下2024-05-05
關(guān)于SpringGateway調(diào)用服務(wù) 接受不到參數(shù)問題
這篇文章主要介紹了關(guān)于SpringGateway調(diào)用服務(wù)接受不到參數(shù)問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Struts2開發(fā)環(huán)境搭建 附簡(jiǎn)單登錄功能實(shí)例
這篇文章主要介紹了Struts2開發(fā)環(huán)境搭建,為大家分享一個(gè)簡(jiǎn)單登錄功能實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11

