2015-09-06 1301 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