2012-11-30 50 views
26

我正在將文件上傳到Amazon s3存儲桶並可以訪問InputStream和包含文件的MIME類型但不包含原始文件名的字符串。在將文件推到S3之前,實際上創建文件名和擴展名取決於我。是否有一個庫或方便的方式來確定從MIME類型使用適當的擴展名?如何從Java中的MIME類型確定合適的文件擴展名

我已經看到了一些對Apache Tika庫的引用,但這似乎是矯枉過正,我還沒有能夠成功檢測到文件擴展名。從我已經能夠收集似乎這樣的代碼應該工作,但我只是得到一個空字符串時,我喜歡的類型變量爲「圖像/ JPEG」

MimeType mimeType = null; 
    try { 
     mimeType = new MimeTypes().forName(type); 
    } catch (MimeTypeException e) { 
     Logger.error("Couldn't Detect Mime Type for type: " + type, e); 
    } 

    if (mimeType != null) { 
     String extension = mimeType.getExtension(); 
     //do something with the extension 
    } 
+1

你確定你需要設置一個文件擴展名?如果你知道MIME類型,你可以用適當的Content-Type將它上傳到S3,並且擴展(通常)變得不相關。 – willglynn

+2

你是對的,我剛剛檢查過,並且在S3的ObjectMetadata中設置Content-Type在我的情況中是有用的。我仍然想知道這個問題的答案,似乎它可以在未來派上用場。 – rphutchinson

+1

夠公平的。對於文件擴展名,沒有一種MIME類型的True True Mapping™ - 一些類型具有多個擴展名,一些擴展名具有多種類型 - 所以當我使用可以獨立存儲的數據存儲時,我嘗試只存儲我知道的並避免猜測。 – willglynn

回答

41

正如一些評論者的已經指出out,mimetypes和文件擴展名之間沒有通用的1:1映射......有些mimetypes有多個可能的擴展名,很多擴展名被多個mimetypes共享,有些mimetypes沒有擴展名。

只要有可能,你最好存儲MIME類型並使用它繼續前進,並忘記擴展名。這就是說,如果你確實想得到給定mimetype的最常見的文件擴展名,那麼Tika是一個很好的選擇。 Apache Tika有一個非常大的一套mimetypes它知道,並且對於其中的許多人來說,它也知道用於檢測,常見擴展,描述等的MIME魔術。

如果您想獲得JPEG文件的最常用擴展名,那麼如圖this Apache Tika unit test您需要做的僅僅是這樣的:

MimeTypes allTypes = MimeTypes.getDefaultMimeTypes(); 
    MimeType jpeg = allTypes.forName("image/jpeg"); 
    String jpegExt = jpeg.getExtension(); // .jpg 
    assertEquals(".jpg", jpeg.getExtension()); 

關鍵的事情是,你需要加載了該公司在提卡罐子捆綁把所有的MIME類型的定義XML文件。如果你可能會處理自定義MIME類型太多,那麼提卡支持這些,變線之一是:

TikaConfig config = TikaConfig.getDefaultConfig(); 
    MimeTypes allTypes = config.getMimeRepository(); 

通過使用TikaConfig方法獲取MIME類型,蒂卡也將檢查您的類路徑的自定義MIME類型defintions,幷包括這些。

相關問題