1. 程式人生 > 程式設計 >java實現上傳檔案型別檢測過程解析

java實現上傳檔案型別檢測過程解析

這篇文章主要介紹了java實現上傳檔案型別檢測過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

在進行檔案上傳時,特別是向普通使用者開放檔案上傳功能時,需要對上傳檔案的格式進行控制,以防止黑客將病毒指令碼上傳。單純的將檔名的型別進行擷取的方式非常容易遭到破解,上傳者只需要將病毒改換檔名便可以完成上傳。

可以讀取檔案的十六進位制的檔案頭,來判斷檔案真正的格式。

讀取檔案的二進位制資料並將其轉換為十六進位制時,同類型檔案的檔案頭資料是相同的,即使改變了其後綴,這個資料也不會改變

import java.io.*;
import java.util.HashMap;

public class GetFileType {

    // 快取檔案頭資訊-檔案頭資訊
    public static final HashMap<String,String> mFileTypes = new HashMap<String,String>();
    static {
      mFileTypes.put("FFD8FFE0","jpg");
      mFileTypes.put("89504E47","png");
      mFileTypes.put("424DC6CC","bmp");
      mFileTypes.put("47494638","gif");
    }
    /**
   * 根據檔案路徑獲取檔案頭資訊
   *
   * @param filePath 檔案路徑
   * @return 檔案頭資訊
   */
  public static String getFileType(String filePath) {
    String type = getFileHeader(filePath);
    System.out.println(type);
    return mFileTypes.get(type);
  }

  /**
   * 根據檔案路徑獲取檔案頭資訊
   *
   * @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() 從此輸入流中讀取一個數據位元組。 int read(byte[] b) 從此輸入流中將最多 b.length
       * 個位元組的資料讀入一個 byte 陣列中。 int read(byte[] b,int off,int len)
       * 從此輸入流中將最多 len 個位元組的資料讀入一個 byte 陣列中。
       */
      is.read(b,b.length);
      value = bytesToHexString(b);
    } catch (Exception e) {
    } finally {
      if (null != is) {
        try {
          is.close();
        } catch (IOException e) {
        }
      }
    }
    return value;
  }

  /**
   * 將要讀取檔案頭資訊的檔案的byte陣列轉換成string型別表示
   *
   * @param src 要讀取檔案頭資訊的檔案的byte陣列
   * @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++) {
      // 以十六進位制(基數 16)無符號整數形式返回一個整數引數的字串表示形式,並轉換為大寫
      hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
      if (hv.length() < 2) {
        builder.append(0);
      }
      builder.append(hv);
    }
    return builder.toString();
  }

  public static void main(String[] args) {
    String path = "E:/file/2.png";
    String type = getFileType(path);
    System.out.println(type);
    path = "E:/file/timg.jpg";
    type = getFileType(path);
    System.out.println(type);
    path = "E:/file/bmp.bmp";
    type = getFileType(path);
    System.out.println(type);
    path = "E:/file/winter.gif";
    type = getFileType(path);
    System.out.println(type);
  }

}

執行輸出

89504E47
png
FFD8FFE0
jpg
424DC6CC
bmp
47494638
gif

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。