2013-03-06 79 views
0

我試圖使用下面的代碼下載文件。我需要確定正在下載的文件的文件名和MIME類型。我從下載的URL不包含文件名。我查看了下面使用的緩衝流的方法,但沒有看到任何方法來做到這一點。確定正在下載的文件的MIME類型

con = (HttpURLConnection) url.openConnection(); 

    //authenticate this request 
    if (passwordAuthentication != null) { 
     String auth = passwordAuthentication.getUserName()+":"+passwordAuthentication.getPassword(); 
     con.setRequestProperty("Authentication", Base64.encodeBase64(auth.getBytes()).toString()); 
    } 

    BufferedInputStream bis = new BufferedInputStream(con.getInputStream()); 
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file.getName())); 
    while ((i = bis.read()) != -1) { 
     bos.write(i); 
    } 
    bos.flush(); 
    bis.close(); 

我看到,我可以通過String contentType = con.getHeaderField("Content-Type");得到它,但返回text/html不是實際文件的ContentType的下載。

編輯:這不是一個重複的問題,另一種方法不提供解決方案,如下所述。

我已經嘗試保存沒有文件擴展名的文件,並使用MagicMatch match = Magic.getMagicMatch(file, true);,但它返回text/plain。我猜這是因爲我保存了它沒有文件擴展名。

+0

@Perception這裏唯一的區別是,我有我需要得到過去之前,我可以確定MIME類型的驗證層。 – Webnet 2013-03-06 05:09:29

+0

你可能想給JMimeMagic庫一個旋轉。它可以探測來自底層字節流的內容類型(即使文件擴展名,內容類型丟失)。我不能保證它的檢測率,但它高於URLConnections探測方法,這是肯定的。 – Perception 2013-03-06 06:47:39

回答

1

在Java 7,您現在可以使用 Files.probeContentType(path)

+0

那麼,這裏的訣竅是我正在下載的文件位於一個URL。這也是一個認證請求。所以它需要用戶名/密碼才能訪問目標網址上的文件。我也必須有一個文件名才能下載文件。這意味着我必須已經定義了文件擴展名: - \ – Webnet 2013-03-06 04:52:17

+0

您也可以嘗試[URLConnection.guessContentTypeFromStream(InputStream)](http://docs.oracle.com/javase/6/docs/api/java/net/ URLConnection.html#guessContentTypeFromStream%28java.io.InputStream%29)。該方法直接檢查輸入流的內容。 – Jeff 2013-03-06 05:12:22