2012-12-08 57 views
5

我試圖從網絡服務器下載文件,並將其保存在服務器與文件一起發送的原始文件名下。下載工作得很好,但我無法獲得真正的文件名。從http下載文件中檢索文件名

對於實例,我試圖下載this file(福昕PDF閱讀器)。

如果我在Chrome等瀏覽器中使用此鏈接,瀏覽器下載包含版本等確切名稱的文件。我從哪裏獲得該名稱?我嘗試閱讀標題信息並正在搜索Content-Disposition,但服務器不發送此信息。我從哪裏得到準確的文件名?

我想是這樣的:

try {    
    URL webfile = new URL("http://www.foxitsoftware.com/downloads/latest.php?product=Foxit-Reader"); 
    URLConnection con = webfile.openConnection(); 
    Map map = con.getHeaderFields(); 
    Set set = map.entrySet(); 
    Iterator iterator = set.iterator(); 
    while (iterator.hasNext()) { 
     System.out.println(iterator.next()); 
    } 
} catch (IOException ex) { 
    System.out.println("Error: "+ex.getMessage()); 
} 

正如你可以在輸出看有沒有Content-Disposition

null=[HTTP/1.1 200 OK] 
ETag=["244005-f36d40-4d003f3868000"] 
Date=[Sat, 08 Dec 2012 12:29:02 GMT] 
Content-Length=[15953216] 
Last-Modified=[Tue, 04 Dec 2012 10:01:36 GMT] 
Content-Type=[application/x-msdos-program] 
Connection=[close] 
Accept-Ranges=[bytes] 
Server=[Apache/2.2.16 (Debian)] 

那麼,怎樣才能檢索到確切的文件名?瀏覽器中的鏈接使用名稱FoxitReader544.11281_enu_Setup.exe下載文件。

有什麼想法?

回答

3
GET /downloads/latest.php?product=Foxit-Reader HTTP/1.1 

給出HTTP/1.1 302 Found

的響應,並將響應頭

Location: http://cdn04.foxitsoftware.com/pub/foxit/reader/desktop/win/5.x/5.4/enu/FoxitReader544.11281_enu_Setup.exe 

最後,您發出,

GET /pub/foxit/reader/desktop/win/5.x/5.4/enu/FoxitReader544.11281_enu_Setup.exe HTTP/1.1 

這就是文件名似乎將從。 因此,如果重定向發生透明,你仍然可能從請求參數獲取文件名。

+0

哇!我猜想GET是正確的,因爲'HTTP/1.1 200 OK'信息?!爲什麼我得到200,如果我應該得到302?! – Marco

+3

如果設置了參數,它會自動跟隨重定向。參見[**'getFollowRedirects()'**](http://docs.oracle.com/javase/1.5.0/docs/api/java/net/HttpURLConnection.html#getFollowRedirects())和[**' setFollowRedirects()'**](http://docs.oracle.com/javase/1.5.0/docs/api/java/net/HttpURLConnection.html#setFollowRedirects(布爾值)) –

+0

不錯!非常感謝你!需要等2分鐘才能接受...;) – Marco