從 Java 中的 MIME 類型取得檔案副檔名
1. 概述
MIME 類型是指定 Internet 上資料的類型和格式的標籤。單一 MIME 類型可以與多個檔案副檔名關聯。例如,「 image/jpeg
」MIME 類型包含諸如「. jpg
“,”。 jpeg
”或“。 jpe
」。
在本教程中,我們將探索確定 Java 中特定 MIjava ME 類型的檔案副檔名的不同方法。我們將重點關註解決該問題的四種主要方法。
我們的一些實作將在擴展名中包含可選的最後一個點。例如,如果我們的 MIME 類型名稱是“ image/jpeg
”,則字串“ jpg
”或“ .jpg
”將作為檔案副檔名傳回。
2. 使用 Apache Tika
Apache Tika是一個工具包,可從各種文件中偵測並提取元資料和文字。它包含豐富且強大的 API,可用於偵測 MIME 類型的檔案副檔名。
讓我們先配置 Maven依賴項:
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>2.9.0</version>
</dependency>
如前所述,單一 MIME 類型可以有多個副檔名。為了處理這個問題, MimeType
類別提供了兩種不同的方法: getExtension()
和getExtensions()
。
getExtension()
方法傳回首選檔案副檔名,而getExtensions()
傳回該 MIME 類型的所有已知檔案副檔名的清單。
接下來,我們將使用MimeType
類別中的兩種方法來檢索擴展名:
@Test
public void whenUsingTika_thenGetFileExtension() {
List<String> expectedExtensions = Arrays.asList(".jpg", ".jpeg", ".jpe", ".jif", ".jfif", ".jfi");
MimeTypes allTypes = MimeTypes.getDefaultMimeTypes();
MimeType type = allTypes.forName("image/jpeg");
String primaryExtension = type.getExtension();
assertEquals(".jpg", primaryExtension);
List<String> detectedExtensions = type.getExtensions();
assertThat(detectedExtensions).containsExactlyElementsOf(expectedExtensions);
}
3. 使用 Jodd Util
我們也可以使用Jodd Util程式庫,它包含一個用於尋找 MIME 類型的檔案副檔名的實用程式。
讓我們先新增 Maven依賴項:
<dependency>
<groupId>org.jodd</groupId>
<artifactId>jodd-util</artifactId>
<version>6.2.1</version>
</dependency>
接下來,我們將使用findExtensionsByMimeTypes()
方法來取得所有支援的檔案副檔名:
@Test
public void whenUsingJodd_thenGetFileExtension() {
List<String> expectedExtensions = Arrays.asList("jpeg", "jpg", "jpe");
String[] detectedExtensions = MimeTypes.findExtensionsByMimeTypes("image/jpeg", false);
assertThat(detectedExtensions).containsExactlyElementsOf(expectedExtensions);
}
Jodd Util 提供了一組有限的可識別檔案類型和副檔名。它優先考慮簡單性而不是全面的覆蓋範圍。
在findExtensionsByMimeTypes()
方法中,我們可以將第二個boolean
參數設為true.
當通配符模式作為 MIME 類型提供時,我們將獲得與指定通配符模式相符的所有 MIME 類型的擴充。
例如,當我們將 MIME 類型設為image/*
並啟用通配符模式時,我們將獲得image
類別中所有 MIME 類型的副檔名。
4. 使用 SimpleMagic
SimpleMagic是一個實用程式包,其主要用途是檔案的 MIME 類型偵測。它還包含一種將 MIME 類型轉換為檔案副檔名的方法。
讓我們先新增 Maven依賴項:
<dependency>
<groupId>com.j256.simplemagic</groupId>
<artifactId>simplemagic</artifactId>
<version>1.17</version>
</dependency>
現在,我們將使用ContentInfo
類別的getFileExtensions()
方法來取得所有支援的檔案副檔名:
@Test
public void whenUsingSimpleMagic_thenGetFileExtension() {
List<String> expectedExtensions = Arrays.asList("jpeg", "jpg", "jpe");
String[] detectedExtensions = ContentType.fromMimeType("image/jpeg").getFileExtensions();
assertThat(detectedExtensions).containsExactlyElementsOf(expectedExtensions);
}
我們在 SimpleMagic 庫中有一個枚舉ContentType
,其中包括 MIME 類型的映射及其對應的檔案副檔名和簡單名稱。 getFileExtensions()
使用此枚舉,使我們能夠根據提供的 MIME 類型檢索檔案副檔名。
5. 使用 MIME 類型到擴充的自訂Map
我們還可以從 MIME 類型取得檔案副檔名,而無需依賴外部程式庫。為此,我們將建立 MIME 類型到檔案副檔名的自訂對應。
讓我們建立一個名為mimeToExtensionMap
的HashMap
,將 MIME 類型與其對應的檔案副檔名關聯起來。 get()
方法允許我們在映射中找到提供的 MIME 類型的預先設定檔副檔名並傳回它們:
@Test
public void whenUsingCustomMap_thenGetFileExtension() {
Map<String, Set<String>> mimeToExtensionMap = new HashMap<>();
List<String> expectedExtensions = Arrays.asList(".jpg", ".jpe", ".jpeg");
addMimeExtensions(mimeToExtensionMap, "image/jpeg", ".jpg");
addMimeExtensions(mimeToExtensionMap, "image/jpeg", ".jpe");
addMimeExtensions(mimeToExtensionMap, "image/jpeg", ".jpeg");
Set<String> detectedExtensions = mimeToExtensionMap.get("image/jpeg");
assertThat(detectedExtensions).containsExactlyElementsOf(expectedExtensions);
}
void addMimeExtensions(Map<String, Set> map, String mimeType, String extension) {
map.computeIfAbsent(mimeType, k-> new HashSet<>()).add(extension);
}
範例地圖包含一些範例,但可以根據需要添加其他映射來輕鬆自訂。
六,結論
在本文中,我們探索了從 MIME 類型中提取檔案副檔名的不同方法。我們研究了兩種不同的方法:利用現有庫和根據我們的需求自訂自訂邏輯。
在處理一組有限的 MIME 類型時,自訂邏輯是一種選擇,儘管它可能存在維護方面的挑戰。相反, Apache Tika 或 Jodd Util 等函式庫提供了廣泛的 MIME 類型覆蓋範圍和易用性,使它們成為處理各種 MIME 類型的可靠選擇。
與往常一樣,本文中使用的源代碼可以在 GitHub 上取得。