2017-05-29 110 views
3

即時消息試圖做的是用httpclient下載文件。目前我的代碼如下。用Apache HttpClient下載文件

HttpClient client = HttpClientBuilder.create().build(); 
    HttpGet request = new HttpGet(downloadURL);  


    HttpResponse response = client.execute(request); 

    HttpEntity entity = response.getEntity(); 
    if (entity != null) { 
     FileOutputStream fos = new FileOutputStream("C:\\file"); 
     entity.writeTo(fos); 
     fos.close(); 
    } 

我的下載網址是類似的東西:http://example.com/file/afz938f348dfa3

正如你可以看到有沒有擴展名的文件(url中至少),但是,當我去到URL使用普通瀏覽器,它確實下載了文件「asdasdaasda.txt」或「asdasdasdsd.pdf」(該名稱與url不同,擴展名並不總是相同,取決​​於我試圖下載的內容)。

我的HTTP響應看起來是這樣的:

日期:星期一,2017年5月29日14點57分十四秒格林尼治標準時間服務器:Apache/2.4.10 內容處置:附件; filename =「149606814324_testfile.txt」 Accept-Ranges:bytes Cache-Control:public,max-age = 0最後修改日期: Mon,29 May 2017 14:29:06 GMT Etag:W /「ead-15c549c4678-gzip 「 Content-Type:text/plain;字符集= UTF-8有所不同:接受編碼 內容編碼:gzip的Content-Length:2554保持活動:超時= 5, 最大= 100連接:保持活動

我該怎麼辦,所以我的java代碼自動下載具有良好的名稱和擴展名在特定文件夾中的文件?

+2

你可能想[這個頭(HTTPS ://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition),但當然這取決於如何從服務器提供文件;請求URL時,顯示普通HTTP響應的樣本接收或提供您使用的是能得到更多的幫助 –

+0

@OvidiuDolha 日期的有效訪問網址:星期一,2017年14時57分十四秒GMT 服務器5月29日:Apache/2.4.10 內容處置:附件;文件名= 「149606814324_testfile.txt」 接受-範圍:字節 緩存控制:公衆,最大年齡= 0 的Last-Modified:星期一,2017年5月29日14時29分06秒GMT 的Etag:W/「ead-15c549c4678-gzip」 Content-Type:text/plain;字符集= UTF-8 有所不同:接受編碼 內容編碼:gzip 內容長度:2554 保持活動:超時= 5,最大= 100 連接:保持活動 – retArdos

回答

2

你可以從你的迴應的content-disposition header

首先,文件名和擴展名獲得頭,然後分析它的文件名作爲explained here,即:

HttpEntity entity = response.getEntity(); 
if (entity != null) { 
    String name = response.getFirstHeader('Content-Disposition').getValue(); 
    String fileName = disposition.replaceFirst("(?i)^.*filename=\"([^\"]+)\".*$", "$1"); 
    FileOutputStream fos = new FileOutputStream("C:\\" + fileName); 
    entity.writeTo(fos); 
    fos.close(); 
} 
+0

非常感謝,你的代碼似乎工作正常。然而,我編寫了這一行的第一個版本:\t String fileName = disposition.substring(disposition.indexOf(「\」「)+ 1,disposition.lastIndexOf(」\「」)); 而不是String fileName = disposition.replaceFirst(「(?i)^。* filename = \」([^ \「] +)。」。* $「,」$ 1「); 這是什麼區別兩個,因爲他們似乎都給出了相同的結果 – retArdos

相關問題