2013-05-09 42 views
0

我有一個可以下載的文件的URL。它看起來像這樣:getContentType方法總是返回'應用程序/強制下載'

http://<server>/recruitment-mantis/plugin.php?page=BugSynchronizer/getfile&fileID=139&filehash=3e7a52a242f90c23539a17f6db094d86 

如何獲取此文件的內容類型?我要聯繫,在這種情況下簡單:

URL url = new URL(stringUrl); 

    URLConnection urlConnection = url.openConnection(); 
    urlConnection.connect(); 

    String urlContent = urlConnection.getContentType(); 

返回我application/force-download內容類型中的每個文件(無論是JPG或PDF文件)。 我想這樣做,因爲我想設置下載文件的擴展名(可以是各種)。如何'繞過'這個application/force-download內容類型?在此先感謝您的幫助。

回答

1

檢查urlConnection.getHeaderField("Content-Disposition")一個文件名。通常該標題用於多部分內容中的附件,但它不會影響檢查。

如果頭不存在,您可以將網址保存到臨時文件,並使用probeContentType得到一個有意義的MIME類型:

Path tempFile = Files.createTempFile(null, null); 
try (InputStream urlStream = urlConnection.getInputStream()) { 
    Files.copy(urlStream, tempFile, StandardCopyOption.REPLACE_EXISTING); 
} 
String mimeType = Files.probeContentType(tempFile); 

注意probeContentType可能返回null如果不能確定文件的類型。

+0

是的,urlConnection.getHeaderField(「Content-Disposition」)解決了這個問題!我在這種情況下得到了如下內容:「attachment:filename:」name_of_file.extension「」。之後,我分割了這個字符串,並且只有擴展名的文件名保存在磁盤上。 Works preety很好,謝謝! – caro2 2013-05-13 19:12:23

0

我猜這個內容類型是從你正在下載的服務器上設置的。某些服務器使用這些內容類型強制瀏覽器下載文件而不是試圖打開它。例如,當我的服務器返回內容類型「application/pdf」時,chrome會嘗試打開它爲pdf,但是當服務器返回「application/force-download」時,瀏覽器會將其保存到磁盤,因爲他不知道該怎麼辦有了這個。

因此,您需要更改服務器以返回正確的內容類型,或者更好地嘗試其他啓發式方法以獲取正確的文件類型,因爲服務器始終可以通過將其設置爲jpg而給予您一個exe文件來說謊。

我用Java 7中看到,你可以試試這個方法: http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#probeContentType%28java.nio.file.Path%29

+0

不幸的是我不能在這個項目中使用Java 7,所以這個解決方案可能不適合我。 – caro2 2013-05-13 19:13:23

1

如何「解決」此應用程序/強制下載內容類型?

我和我上傳的內容類型有同樣的問題。雖然您可以信任URL中的內容類型,但我選擇尋找內容類型實用程序來確定字節內容的內容。

嘗試了5次左右的實現之後,我決定重新發明輪子併發布我的SimpleMagic package,它利用magic(5)Unix內容類型文件實現與Unix文件(1)命令相同的功能。它使用內部配置文件或可以讀取/etc/magic,/usr/share/file/magi c或其他魔術(5)文件,並從File,InputStreambyte[]確定文件內容。

從主頁可以找到github源代碼,javadocs和一些文檔的位置。

隨着SimpleMagic,你做的東西像下面這樣:

ContentInfoUtil util = new ContentInfoUtil(); 
ContentInfo info = util.findMatch(byteArray); 

它從數據(FileInputStream,或byte[]),而不是文件名的內容的作品。

+1

最後一個簡單的解決方案。謝謝! – Roben 2013-06-25 15:38:45