1. 程式人生 > >java根據“魔數”判斷上傳的檔案型別

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