2013-05-07 27 views
1

我們的應用程序使用Commons VFS來讀取各種類型的文件。我們使用VFS提供的自動文件類型檢測,通過它的file extension mapping如何配置Commons VFS自動檢測gz文件

問題:VFS將gz文件(即名稱以.gz結尾的文件)誤分類爲常規文件,而不是GZIP文件。這可以防止我們使用VFS讀取gz文件的(解壓縮的)內容,而不需要特殊的手動破解。

我追蹤的問題org.apache.commons.vfs2.impl.FileContentInfoFilenameFactory.create(),它調用

FileNameMap fileNameMap = URLConnection.getFileNameMap(); 
contentType = fileNameMap.getContentTypeFor(name); 

這從當前Java安裝加載文件content-types.properties。該文件(在Windows,至少)包含此映射:

application/octet-stream: \ 
    description=Generic Binary Stream;\ 
    file_extensions=.saveme,.dump,.hqx,.arc,.obj,.lib,.bin,.exe,.zip,.gz  

根據源代碼,org.apache.commons.vfs2.impl.FileTypeMap允許這種映射到優先於與VFS進行配置的文件的擴展名的地圖。

任何人都可以想出一種方法:(a)擴展一個或兩個VFS來解決這個問題;或者(b)配置VFS和/或Java本身,以便VFS正確分類gz文件?

回答

0

創建一類像下面覆蓋的FileNameMapgetContentTypeFor法和排除麻煩application/octet-stream項:

URLConnection.setFileNameMap(new MyFileNameMap()); 

,當你調用FileSystemManager.resolveFile()現在:

public static class MyFileNameMap implements FileNameMap 
{ 
    private FileNameMap delegate = URLConnection.getFileNameMap(); 

    @Override 
    public String getContentTypeFor(String fileName) 
    { 
     String contentType = delegate.getContentTypeFor(fileName); 
     if("application/octet-stream".equals(contentType)) 
     { 
      // Sun's java classifies zip and gzip as application/octet-stream, 
      // which VFS then uses, instead of looking at its extension 
      // map for a more specific mime type 
      return null; 
     } 
     return contentType; 
    } 
} 

通過安裝這個新類,VFS將通過回退到其擴展映射來爲gz文件選擇正確的文件類型。

注:這是當前的JVM一個全球性的變化,所以要小心,如果你使用的是需要的東西像.exe文件此MIME類型條目的任何其他代碼。

相關問題