在 Java 中檢查檔案是否為圖像
瀏覽人數:128最近更新:
1. 概述
在 Java 中進行檔案上傳時,確保上傳的檔案確實是圖像至關重要,尤其是當檔案名稱和副檔名可能會產生誤導時。
在本教程中,我們將探討兩種確定檔案是否為影像的方法:檢查檔案的實際內容和根據檔案的副檔名進行驗證。
2. 檢查文件內容
確定文件是否為圖像的最可靠方法之一是檢查其內容。讓我們探討兩種方法來執行此操作:使用 Apache Tika,然後使用內建的 Java ImageIO
類別。
2.1 使用阿帕契蒂卡
mimeApache Tika 是一個功能強大的庫,用於從各種文件類型中偵測和提取元資料。
讓我們將 Apache Tika核心加入到我們的專案依賴項:
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>2.9.2</version>
</dependency>
然後,我們可以使用這個函式庫實作一個方法來檢查檔案是否是圖像:
public static boolean isImageFileUsingTika(File file) throws IOException {
Tika tika = new Tika();
String mimeType = tika.detect(file);
return mimeType.startsWith("image/");
}
Apache Tika 不會將整個檔案讀入內存,只檢查前幾個字節。因此,我們應該將 Tika 與可信任來源一起使用,因為僅檢查前幾個字節也意味著攻擊者可能能夠走私非影像的可執行檔。
2.2.使用 Java ImageIO
類別
Java 內建的ImageIO
類別也可以透過嘗試將檔案讀取為映像來確定檔案是否為映像:
public static boolean isImageFileUsingImageIO(File file) throws IOException {
BufferedImage image = ImageIO.read(file);
return image != null;
}
ImageIO.read()
方法將整個檔案讀取到記憶體中,因此如果我們只想測試該檔案是否為影像,效率很低。
3. 檢查檔案副檔名
一種更簡單但不太可靠的方法是檢查檔案副檔名。此方法不能保證檔案內容與副檔名相匹配,但它更快、更容易。
Java 內建的Files.probeContentType()
方法可以根據檔案的副檔名來決定檔案的 MIME 類型。我們可以這樣使用它:
public static boolean isImageFileUsingProbeContentType(File file) throws IOException {
Path filePath = file.toPath();
String mimeType = Files.probeContentType(filePath);
return mimeType != null && mimeType.startsWith("image/");
}
當然,我們總是可以自己寫一個Java方法來檢查檔案副檔名是否在預先定義列表中。
4. 方法總結
讓我們比較一下每種方法的優缺點:
Checking file content
:- 使用 Apache Tika:讀取檔案的前幾個位元組。它可靠且高效,但應與可信來源一起使用。
- 使用 Java
ImageIO
:嘗試將檔案作為映像讀取。這是最可靠但效率低的。
-
Checking file extension
:根據檔案的副檔名來判斷,這樣更快更簡單,但也不能保證檔案內容是圖像。
5. 結論
在本教程中,我們探索了在 Java 中檢查檔案是否為圖像的不同方法。在檢查檔案內容更可靠的同時,檢查檔案副檔名也更快更容易。
本教學的範例程式碼可以在 GitHub 上找到。
本作品係原創或者翻譯,採用《署名-非商業性使用-禁止演繹4.0國際》許可協議