java根據“魔數”判斷上傳的檔案型別
與Java的class檔案類似,很多型別的檔案,起始的幾個位元組內容都是固定的,跟據這幾個位元組的內容,就可以判斷檔案的型別,這幾個位元組也被稱為“魔數”,比如class檔案的魔數就是“CAFEBABE”。
通過魔數判斷檔案型別便是一種更安全的方式:
一:建立列舉類
public enum FileType {
/** JPEG */
JPEG("FFD8FF"),
/** PNG */
PNG("89504E47"),
/** GIF */
GIF("47494638"),
/** TIFF */
TIFF("49492A00"),
/** Windows bitmap */
BMP("424D"),
/** CAD */
DWG("41433130"),
/** Adobe photoshop */
PSD("38425053"),
/** Rich Text Format */
RTF("7B5C727466"),
/** XML */
XML("3C3F786D6C"),
/** HTML */
HTML("68746D6C3E"),
/** Outlook Express */
DBX("CFAD12FEC5FD746F "),
/** Outlook */
PST("2142444E"),
/** doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db */
OLE2("0xD0CF11E0A1B11AE1"),
/** Microsoft Word/Excel */
XLS_DOC("D0CF11E0"),
/** Microsoft Access */
MDB("5374616E64617264204A"),
/** Word Perfect */
WPB("FF575043"),
/** Postscript */
EPS_PS("252150532D41646F6265"),
/** Adobe Acrobat */
PDF("255044462D312E"),
/** Windows Password */
PWL("E3828596"),
/** ZIP Archive */
ZIP("504B0304"),
/** ARAR Archive */
RAR("52617221"),
/** WAVE */
WAV("57415645"),
/** AVI */
AVI("41564920"),
/** Real Audio */
RAM("2E7261FD"),
/** Real Media */
RM("2E524D46"),
/** Quicktime */
MOV("6D6F6F76"),
/** Windows Media */
ASF("3026B2758E66CF11"),
/** MIDI */
MID("4D546864");
private String value = "";
private FileType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
二:建立工具類
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FilUtil {
/** 判斷檔案型別 */public static FileType getType(String filePath) throws IOException {
// 獲取檔案頭
String fileHead = getFileHeader(filePath);
if (fileHead != null && fileHead.length() > 0) {
fileHead = fileHead.toUpperCase();
FileType[] fileTypes = FileType.values();
for (FileType type : fileTypes) {
if (fileHead.startsWith(type.getValue())) {
return type;
}
}
}
return null;
}
/** 讀取檔案頭 */
private static String getFileHeader(String filePath) throws IOException {
byte[] b = new byte[28];
InputStream inputStream = null;
try {
inputStream = new FileInputStream(filePath);
inputStream.read(b, 0, 28);
} finally {
if (inputStream != null) {
inputStream.close();
}
}
return bytesToHex(b);
}
/** 將位元組陣列轉換成16進位制字串 */
public static String bytesToHex(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
}
需要注意的是,可能存在一種型別檔案的魔數與另一種型別檔案魔數的前面部分相等(如‘D0CF11E0’與‘D0CF11E0A1B11AE1’),所以應該儘量將更長的魔數值放在上面。這裡的檔案與魔數列舉得也不全面,但思路就這樣。
以下例出的是一些我們常見的檔案型別,以及它用於判斷這種檔案的型別的幾個開始位元組及所對尖的ASCII數字:
圖片檔案
檔案型別 | 副檔名 |
16進位制數字 xx這裡表示變數 |
Ascii數字 . = 不是Ascii字元 |
---|---|---|---|
Bitmap format | .bmp | 42 4d | BM |
FITS format | .fits | 53 49 4d 50 4c 45 | SIMPLE |
GIF format | .gif | 47 49 46 38 | GIF8 |
Graphics Kernel System | .gks | 47 4b 53 4d | GKSM |
IRIS rgb format | .rgb | 01 da | .. |
ITC (CMU WM) format | .itc | f1 00 40 bb | …. |
JPEG File Interchange Format | .jpg | ff d8 ff e0 | …. |
NIFF (Navy TIFF) | .nif | 49 49 4e 31 | IIN1 |
PM format | .pm | 56 49 45 57 | VIEW |
PNG format | .png | 89 50 4e 47 | .PNG |
Postscript format | .[e]ps | 25 21 | %! |
Sun Rasterfile | .ras | 59 a6 6a 95 | Y.j. |
Targa format | .tga | xx xx xx | … |
TIFF format (Motorola – big endian) | .tif | 4d 4d 00 2a | MM.* |
TIFF format (Intel – little endian) | .tif | 49 49 2a 00 | II*. |
X11 Bitmap format | .xbm | xx xx | |
XCF Gimp file structure | .xcf | 67 69 6d 70 20 78 63 66 20 76 | gimp xcf |
Xfig format | .fig | 23 46 49 47 | #FIG |
XPM format | .xpm | 2f 2a 20 58 50 4d 20 2a 2f | /* XPM */ |
壓縮檔案
檔案型別 | 副檔名 |
16進位制數字 xx這裡表示變數 |
Ascii數字 . = 不是Ascii字元 |
---|---|---|---|
Bzip | .bz | 42 5a | BZ |
Compress | .Z | 1f 9d | .. |
gzip format | .gz | 1f 8b | .. |
pkzip format | .zip | 50 4b 03 04 | PK.. |
存檔檔案
檔案型別 | 副檔名 |
16進位制數字 xx這裡表示變數 |
Ascii數字 . = 不是Ascii字元 |
---|---|---|---|
TAR (pre-POSIX) | .tar | xx xx | (a filename) |
TAR (POSIX) | .tar | 75 73 74 61 72 | ustar (offset by 257 bytes) |
可執行檔案
檔案型別 | 副檔名 |
16進位制數字 xx這裡表示變數 |
Ascii數字 . = 不是Ascii字元 |
---|---|---|---|
MS-DOS, OS/2 or MS Windows | 4d 5a | MZ | |
Unix elf | 7f 45 4c 46 | .ELF |
其它檔案
檔案型別 | 副檔名 |
16進位制數字 xx這裡表示變數 |
Ascii數字 . = 不是Ascii字元 |
---|---|---|---|
pgp public ring | 99 00 | .. | |
pgp security ring | 95 01 | .. | |
pgp security ring | 95 00 | .. | |
pgp encrypted data | a6 00 | ¦. |
除上述“魔數”外,還可以判斷圖片是否可以縮放,即獲取長和寬:
/**
* <p>Discription:[isImage,判斷檔案是否為圖片]</p>
* @param file
* @return true 是 | false 否
*/
public static final boolean isImage(File file){
boolean flag = false;
try
{
BufferedImage bufreader = ImageIO.read(file);
int width = bufreader.getWidth();
int height = bufreader.getHeight();
if(width==0 || height==0){
flag = false;
}else {
flag = true;
}
}
catch (IOException e)
{
flag = false;
}catch (Exception e) {
flag = false;
}
return flag;
}
相關推薦
java根據“魔數”判斷上傳的檔案型別
與Java的class檔案類似,很多型別的檔案,起始的幾個位元組內容都是固定的,跟據這幾個位元組的內容,就可以判斷檔案的型別,這幾個位元組也被稱為“魔數”,比如class檔案的魔數就是“CAFEBABE”。 通過魔數判斷檔案型別便是一種更安全的方式: 一:建立列舉類
Java 通過魔數判斷上傳檔案的型別
前言 檔案上傳功能是很多網站都必須的功能,而判斷檔案型別不僅可以過濾檔案的上傳,同時也能防範使用者上傳惡意的可執行檔案和指令碼,以及將檔案上傳伺服器當作免費的檔案儲存伺服器使用。 而對於上傳檔案來說,不能簡單的通過後綴名來判斷檔案的型別,因為惡意攻擊可以將可執行檔案的字尾
Vue.js下載檔案及判斷上傳檔案型別,獲取上傳檔案大小
目錄 下載檔案 方法一 方法二 方法三 1.程式碼 1.程式碼 1.程式碼 下載檔案 所用的瀏覽器:Google Chrome 方法一 功能:點選匯出按鈕,提交請求,下載excel檔案; 1.跟後端
java 後臺通過post請求 上傳檔案
文章轉載:https://blog.csdn.net/wohaqiyi/article/details/77621517 import microservice.fpzj.control.base.BaseController; import org.springframewo
Java 傳送http請求,上傳檔案
package wxapi.WxHelper; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.F
java、 http模擬post上傳檔案到服務端 模擬form上傳檔案
需求是這樣的: **1,前後端分離,前端對接pc軟體進行檔案同步的介面,後的springboot微服務進行檔案接收和處理。 2,軟體不能直接呼叫微服務的介面進行上傳,只能先走一下前端controller進行轉發過來()。 3,這樣就只能用httpclien
ExtJS4 上傳檔案型別和大小的判斷方法(例項) .
接本人博文《》,在上面的基礎上加上ExtJS上傳檔案前對檔案型別和檔案大小進行判斷,不符合要求的將不能被上傳。 PS:本人的原創博文是在開發中遇到的一些常見問題或難題作記錄。由於我是初學者,知識面還遠遠不夠,所以可能有許多地方並不是很好的解決方案,希望朋友你有想法能給予答覆。謝謝! 開始本文的方案描述(原
JS 限制上傳檔案型別
直接上程式碼,網上看的,自己改了BUG。實測。 html程式碼 <input type="file" name="ksjh_file" class="ui_hidden" id="uploadksjh" accept="xls,xlsx" onchange="checkFileTy
PHP檔案上傳操作例項詳解(包含上傳檔案型別MIME驗證)
本文例項分析了PHP檔案上傳操作。分享給大家供大家參考,具體如下: 檔案上傳 發生在瀏覽器向伺服器發出的請求中。 檔案,對於瀏覽器來講,就是表單中的一個特殊型別的資料而已。 瀏覽器表單中的資料,兩種型別: 字串型別(位元組流編碼) 檔案型別(二進位制編碼),檔案是表單資料中
jquery fileupload限制上傳檔案型別
jquery fileupload是一款不錯的上傳檔案jquery外掛,官網地址為:https://github.com/blueimp/jQuery-File-Upload,使用手冊:https:
關於ajax提交file上傳檔案型別的表單的一些例項及遇到的問題和解決辦法
ajax提交的表單有兩種情況: 第一種:input type型別沒有file上傳檔案型別的表單 第二種:input type型別有file上傳檔案型別的表單 之所以分為兩種:是因為原生ajax是不能提交檔案的,因為ajax與後臺的通訊是通過字串的. 第一種無file型別表單的ajax上傳方式:
java 根據url連結判斷伺服器上的檔案是否存在有效
方法一: URL serverUrl = new URL("http://localhost:8090/Demo/clean.sql"); HttpURLConnection urlcon = (HttpURLConnection) se
java上傳檔案以流方式判斷型別
package com.omg.utils; /** * 檔案型別枚取 */ public enum FileType { /** * JEPG. */ JPEG("FFD8FF"), /** * PNG. */ PNG("89504E47
JAVA WEB 判斷上傳的檔案是否是圖片
在Web程式中,如果限制上傳檔案為圖片,大部分方法都採取檢查副檔名。這樣,當把一個非圖片檔案的副檔名改為jpg、gif或者bmp時,就能繞過限制。所以必須得通過讀取檔案內容來進行判斷。這裡提供兩種實現程式碼。 ImageInputStream iis = ImageIO
Qt Http QHttpMultiPart上傳檔案到java http伺服器
Qt Http QHttpMultiPart上傳檔案到java http伺服器 1.最近專案用到了Qt上傳檔案到HT
java圖片上傳-檔案/圖片上傳到七牛
java圖片上傳-檔案(圖片)上傳到七牛 一、在配置檔案中引入依賴(注:七牛開發者url:https://developer.qiniu.com/kodo) <-- 引入依賴 --> <dependency> <
java後臺發起上傳檔案的post請求(http和https)
分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/aabbyyz 一、http post 對於檔案上傳,客戶端通常就是頁
根據request,上傳檔案(使用Spring CommonsMultipartResolver 上傳檔案)
/** * 根據request,獲取上傳的非結構化資料 * 備註:非結構化資料會儲存臨時檔案,並返回臨時檔案路徑的集合 *
Sikuli 整合Selenium Webdriver 上傳檔案-- Java
Sikuli 整合Selenium Webdriver -- Java 目錄 Sikuli簡介 主要目的 環境設定 第一種 第二種 用Sikuli上傳檔案
java通過ftp 上傳檔案到伺服器
package com.dl.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ja