2015-09-06 1304 views
0

我正在寫一個小型java程序,用於從Internet下載黑名單。
網址可以有兩種類型:
1)直接連接,例如:http://www.shallalist.de/Downloads/shallalist.tar.gz
絕對沒有問題就在這裏,我們可以使用一些庫,如:apache.commons.io.FilenameUtils;或者乾脆尋找的"/"最後一次出現和"."
2)「frienly網址」,這是一樣的東西:http://urlblacklist.com/cgi-bin/commercialdownload.pl?type=download&file=bigblacklist
這裏沒有明確的文件名和擴展名是存在的,但如果我用我的瀏覽器或互聯網下載管理(IDM),文件名+擴展名是:"bigblacklist.tar.gz"
如何解決這個問題在Java中,並從「友好」的URL獲得文件名和擴展名?

P.S:我知道Content-DispositionContent-Type領域,但響應頭的urlblacklist鏈接:
在java中獲取友好URL的文件名和擴展名

Transfer-Encoding : [chunked] 
Keep-Alive : [timeout=5, max=100] 
null : [HTTP/1.1 200 OK] 
Server : [Apache/2.4.10 (Debian)] 
Connection : [Keep-Alive] 
Date : [Sat, 05 Sep 2015 23:51:35 GMT] 
Content-Type : [ application/octet-stream] 

正如我們看到的,沒有什麼用.GZIP(。廣州)連接。如何使用java處理它?
Web瀏覽器和下載管理器如何識別正確的名稱和擴展名?

===============更新=====================
感謝@eugenioy,問題是解決了。真正的麻煩在於我的多次下載嘗試的IP阻塞,這就是我決定使用代理服務器的原因。現在看來,(對於這兩種類型的URL):

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIP, port)); 
HttpURLConnection httpConn = (HttpURLConnection) new URL(downloadFrom).openConnection(proxy); 
String disposition = httpConn.getHeaderField("Content-Disposition"); 
if (disposition != null) { 
// extracts file name from header field 
    int index = disposition.indexOf("filename"); 
    if (index > 0) { 
     fullFileName = disposition.substring(disposition.lastIndexOf("=") + 1, disposition.length()); 
    } 
} else { 
// extracts file name from URL 
    fullFileName = downloadFrom.substring(downloadFrom.lastIndexOf("/") + 1, downloadFrom.length()); 
      } 

現在fullFileName包含的文件名來下載+推廣。

回答

1

看看從捲曲的輸出:

curl -s -D - 'http://urlblacklist.com/cgi-bin/commercialdownload.pl?type=download&file=bigblacklist' -o /dev/null 

你會看到這樣的響應:

HTTP/1.1 200 OK 
Date: Sun, 06 Sep 2015 00:55:51 GMT 
Server: Apache/2.4.10 (Debian) 
Content-disposition: attachement; filename=bigblacklist.tar.gz 
Content-length: 22840787 
Content-Type: application/octet-stream 

我客串這就是瀏覽器是如何得到的文件名和擴展名:

Content-disposition: attachement; filename=bigblacklist.tar.gz 

或者從Java那做:

URL obj = new URL("http://urlblacklist.com/cgi-bin/commercialdownload.pl?type=download&file=bigblacklist"); 
    URLConnection conn = obj.openConnection(); 
    String disposition = conn.getHeaderField("Content-disposition"); 
    System.out.println(disposition); 

注意:服務器似乎在嘗試多次後會阻止您的IP,因此如果您今天已經嘗試了很多次,請務必從「乾淨」IP嘗試此操作。

+0

謝謝你的回覆!實際的問題是IP阻塞。這就是爲什麼我決定使用代理,現在它適用於我! – insanecoding