java - 从java中的友好url获取文件名和扩展名

标签 java http url

我正在编写一个小型 java 程序,用于从互联网下载黑名单。
URL 可以有两种类型:
1) 直接链接,例如:http://www.shallalist.de/Downloads/shallalist.tar.gz
这里绝对没有问题,我们可以使用一些库,例如:apache.commons.io.FilenameUtils;或者只是查找最后一次出现的"/""."
2)“友好网址”,类似于:http://urlblacklist.com/cgi-bin/commercialdownload.pl?type=download&file=bigblacklist
这里没有明确的文件名和扩展名,但如果我使用浏览器或 Internet 下载管理器 (IDM),文件名+扩展名将是:"bigblacklist.tar.gz"
如何在java中解决这个问题并从“友好”的URL获取文件名和扩展名?

P.S:我知道 Content-DispositionContent-Type 字段,但 urlblacklist 链接的响应 header 是:

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 (.gz) 没有任何关系。使用java该如何处理呢?
网络浏览器和下载管理器如何识别正确的名称和扩展名?

==============更新======================
感谢@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包含要下载的文件的名称及其扩展名。

最佳答案

看一下curl的输出:

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 进行尝试。

关于java - 从java中的友好url获取文件名和扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32419003/

相关文章:

Java:需要修改乘法表字符串以在每个字符之间添加空格

java - 无法使用随机生成的数字对数组进行排序

php - PHP 究竟是如何创建超全局 $_POST、$_GET、$_COOKIE 和 $_REQUEST 的?

java - 在内网开一个http连接开销大吗?

javascript - 互联网浏览器 : HTML entities in URL

java - 尝试调用方法时出现"invalid method declaration; return type required"

java - JSONArray 未正确返回

http - Telegram 机器人 API 响应 403 Forbidden

c# - 用于识别网址的正则表达式

url - ReSTLet - 访问请求 URL 的元素