java如何實(shí)現(xiàn)判斷文件的真實(shí)類型
在文件傳輸過(guò)程中,為了安全驗(yàn)證,對(duì)于手工改動(dòng)文件后綴名產(chǎn)生的偽造文件進(jìn)行判斷過(guò)濾。
比如,我們需要的是excel文件,如果不加驗(yàn)證內(nèi)容,將一些可執(zhí)行的文件通過(guò)更改后綴傳輸給你,就是一個(gè)很大的漏洞了。
Java判斷文件真實(shí)類型依靠的是文件的頭部編碼信息,具體代碼如下:
package com.zhuifeng.util.excel;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
/**
* @author guoxk
*
* 類描述:獲取和判斷文件頭信息
* |--文件頭是位于文件開頭的一段承擔(dān)一定任務(wù)的數(shù)據(jù),一般都在開頭的部分。
* |--頭文件作為一種包含功能函數(shù)、數(shù)據(jù)接口聲明的載體文件,用于保存程序的聲明(declaration),而定義文件用于保存程序的實(shí)現(xiàn)(implementation)。
* |--為了解決在用戶上傳文件的時(shí)候在服務(wù)器端判斷文件類型的問(wèn)題,故用獲取文件頭的方式,直接讀取文件的前幾個(gè)字節(jié),來(lái)判斷上傳文件是否符合格式。
*
*/
public class CheckExcelFileTypeUtil {
// 緩存文件頭信息-文件頭信息
public static final HashMap<String, String> mFileTypes = new HashMap<String, String>();
static {
// images
mFileTypes.put("FFD8FF", "jpg");
mFileTypes.put("89504E47", "png");
mFileTypes.put("47494638", "gif");
mFileTypes.put("49492A00", "tif");
mFileTypes.put("424D", "bmp");
//
mFileTypes.put("41433130", "dwg"); // CAD
mFileTypes.put("38425053", "psd");
mFileTypes.put("7B5C727466", "rtf"); // 日記本
mFileTypes.put("3C3F786D6C", "xml");
mFileTypes.put("68746D6C3E", "html");
mFileTypes.put("44656C69766572792D646174653A", "eml"); // 郵件
mFileTypes.put("D0CF11E0", "doc");
mFileTypes.put("D0CF11E0", "xls");//excel2003版本文件
mFileTypes.put("5374616E64617264204A", "mdb");
mFileTypes.put("252150532D41646F6265", "ps");
mFileTypes.put("255044462D312E", "pdf");
mFileTypes.put("504B0304", "docx");
mFileTypes.put("504B0304", "xlsx");//excel2007以上版本文件
mFileTypes.put("52617221", "rar");
mFileTypes.put("57415645", "wav");
mFileTypes.put("41564920", "avi");
mFileTypes.put("2E524D46", "rm");
mFileTypes.put("000001BA", "mpg");
mFileTypes.put("000001B3", "mpg");
mFileTypes.put("6D6F6F76", "mov");
mFileTypes.put("3026B2758E66CF11", "asf");
mFileTypes.put("4D546864", "mid");
mFileTypes.put("1F8B08", "gz");
}
/**
* @author guoxk
*
* 方法描述:根據(jù)文件路徑獲取文件頭信息
* @param filePath 文件路徑
* @return 文件頭信息
*/
public static String getFileType(String filePath) {
// System.out.println(getFileHeader(filePath));
// System.out.println(mFileTypes.get(getFileHeader(filePath)));
return mFileTypes.get(getFileHeader(filePath));
}
/**
* @author guoxk
*
* 方法描述:根據(jù)文件路徑獲取文件頭信息
* @param filePath 文件路徑
* @return 文件頭信息
*/
public static String getFileHeader(String filePath) {
FileInputStream is = null;
String value = null;
try {
is = new FileInputStream(filePath);
byte[] b = new byte[4];
/*
* int read() 從此輸入流中讀取一個(gè)數(shù)據(jù)字節(jié)。int read(byte[] b) 從此輸入流中將最多 b.length
* 個(gè)字節(jié)的數(shù)據(jù)讀入一個(gè) byte 數(shù)組中。 int read(byte[] b, int off, int len)
* 從此輸入流中將最多 len 個(gè)字節(jié)的數(shù)據(jù)讀入一個(gè) byte 數(shù)組中。
*/
is.read(b, 0, b.length);
value = bytesToHexString(b);
} catch (Exception e) {
} finally {
if (null != is) {
try {
is.close();
} catch (IOException e) {
}
}
}
return value;
}
/**
* @author guoxk
*
* 方法描述:將要讀取文件頭信息的文件的byte數(shù)組轉(zhuǎn)換成string類型表示
* @param src 要讀取文件頭信息的文件的byte數(shù)組
* @return 文件頭信息
*/
private static String bytesToHexString(byte[] src) {
StringBuilder builder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
String hv;
for (int i = 0; i < src.length; i++) {
// 以十六進(jìn)制(基數(shù) 16)無(wú)符號(hào)整數(shù)形式返回一個(gè)整數(shù)參數(shù)的字符串表示形式,并轉(zhuǎn)換為大寫
hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
if (hv.length() < 2) {
builder.append(0);
}
builder.append(hv);
}
// System.out.println(builder.toString());
return builder.toString();
}
/**
* @author guoxk
*
* 方法描述:測(cè)試
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
final String fileType = getFileType("E:\\補(bǔ)貼名單.xls");
System.out.println(fileType);
}}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA2020.3創(chuàng)建web工程的完整步驟
這篇文章主要給大家介紹了關(guān)于IDEA2020.3創(chuàng)建web工程的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
java后臺(tái)調(diào)用接口及處理跨域問(wèn)題的解決
這篇文章主要介紹了java后臺(tái)調(diào)用接口,處理跨域的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
梳理總結(jié)Java?static關(guān)鍵字的方法作用
這篇文章主要介紹了梳理總結(jié)Java?static關(guān)鍵字的方法作用,?static?關(guān)鍵字可以用來(lái)修飾的成員變量和成員方法,被修飾的成員是屬于類的,而不是單單是屬于某個(gè)對(duì)象的2022-06-06
騰訊云部署javaWeb項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了騰訊云部署javaWeb項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
RabbitMQ死信機(jī)制實(shí)現(xiàn)延遲隊(duì)列的實(shí)戰(zhàn)
本文主要介紹了RabbitMQ死信機(jī)制實(shí)現(xiàn)延遲隊(duì)列的實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率
這篇文章主要介紹了從java反編譯及字節(jié)碼角度探索分析String拼接字符串效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Collections.shuffle()方法實(shí)例解析
這篇文章主要介紹了Collections.shuffle()方法實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Java使用easyExcel導(dǎo)出excel數(shù)據(jù)案例
這篇文章主要介紹了Java使用easyExcel導(dǎo)出excel數(shù)據(jù)案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
spring boot使用i18n時(shí)properties文件中文亂碼問(wèn)題的解決方法
這篇文章主要介紹了spring boot使用i18n時(shí)properties文件中文亂碼問(wèn)題的解決方法,需要的朋友可以參考下2017-11-11

