我正在寫一個小型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-Disposition
和Content-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
包含的文件名來下載+推廣。
謝謝你的回覆!實際的問題是IP阻塞。這就是爲什麼我決定使用代理,現在它適用於我! – insanecoding