Java校驗(yàn)文件類型實(shí)現(xiàn)方式
通常校驗(yàn)文件類型,是獲取文件后綴,根據(jù)后綴名進(jìn)行判斷。
但其實(shí)這種方式是有被欺騙風(fēng)險(xiǎn)的。
下面記錄幾種判斷文件類型的方式。
MIME類型判斷
MIME (Multipurpose Internet Mail Extensions) 類型是用來(lái)標(biāo)識(shí)文件類型的一種方式。
每種文件類型都有一個(gè)對(duì)應(yīng)的MIME類型,獲取上傳文件的MIME類型,可以判斷文件的類型。
import javax.activation.MimetypesFileTypeMap;
import java.io.File;
File file = new File("example.jpg");
String mimeType = new MimetypesFileTypeMap().getContentType(file);
if (mimeType.equals("image/jpeg") || mimeType.equals("image/png")) {
// 文件類型合法
} else {
// 文件類型不合法
}
這種方式適合用來(lái)判斷指定文件是否為指定類型。
需要注意:
- 使用文件的MIME類型驗(yàn)證文件類型需要java 7及以上版本的支持。
- 另外,不同的操作系統(tǒng)和文件系統(tǒng)可能對(duì)MIME類型的識(shí)別有所差異,需進(jìn)行充分測(cè)試。
文件頭校驗(yàn)
文件頭是文件開(kāi)頭的幾個(gè)字節(jié),通常用于標(biāo)識(shí)文件的類型和格式。
校驗(yàn)文件頭,可以判斷文件類型是否符合預(yù)期。
import java.io.FileInputstream;
import java.io.IoException;
public class FileValidator {
public void imgFileValidator(String filePath) throws Exception {
FileInputstream fis = new FileInputstream(filePath)
byte[] header = new byte[4];
fis.read(header);
if(header[0] == (byte) 0x && header[1] == (byte) 0xD8){
// 文件類型是JPEG
}
}
}
讀取JPEG文件的前兩個(gè)字節(jié),并檢查其是否等于JPEG文件的固定文件頭。如果文件頭不匹配,則說(shuō)明文件格式不正確。
上述代碼是JPEG格式的判定,如果是ZIP格式判定,代碼如下:
public void zipFileValidator(String filePath) throws Exception{
FileInputstream fis = new FileInputstream(filePath);
byte[l buffer = new byte[4];
fis.read(buffer,0,4);
fis.close();
if(buffer[0] == (byte)0x50
&& buffer[1] == (byte)0x4B
&& buffer[2] == (byte)0x03
&& buffer[3] == (byte)0x04){
//文件類型為zip
}
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中實(shí)現(xiàn)簡(jiǎn)單的Excel導(dǎo)出
今天小編就為大家分享一篇關(guān)于Java中實(shí)現(xiàn)簡(jiǎn)單的Excel導(dǎo)出,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
Spring Boot Actuator監(jiān)控端點(diǎn)小結(jié)
這篇文章主要介紹了Spring Boot Actuator監(jiān)控端點(diǎn)小結(jié),需要的朋友可以參考下2017-06-06
Java 中的 Consumer 與 Supplier 接口使用場(chǎng)景與
文章介紹了Java 8中函數(shù)式接口的核心概念,Consumer與Supplier接口使用場(chǎng)景與示例,重點(diǎn)對(duì)比了Consumer(消費(fèi)數(shù)據(jù))與Supplier(供給數(shù)據(jù))的區(qū)別,感興趣的朋友跟隨小編一起看看吧2025-08-08
Java線程池的幾種實(shí)現(xiàn)方法和區(qū)別介紹
下面小編就為大家?guī)?lái)一篇Java線程池的幾種實(shí)現(xiàn)方法和區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2016-05-05
springboot 如何設(shè)置端口號(hào)和添加項(xiàng)目名
這篇文章主要介紹了springboot設(shè)置端口號(hào)和添加項(xiàng)目名的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java easyUI實(shí)現(xiàn)自定義網(wǎng)格視圖的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10

