在Java中获取友好URL后面的文件名

时间:2012-05-01 22:51:42

标签: java android http

我怎么知道url背后的文件名(不解析url及其“/”)。例如:

如果您使用浏览器访问此网址:

http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts

它解析为“ubuntu-12.04-desktop-i386.iso”。如何在java中检索此文件名以下载具有原始名称的文件?

由于

2 个答案:

答案 0 :(得分:3)

您可以使用HEAD请求动词尝试发现数据;对于这个特定的文件(并使用优秀的基于Perl的HTTP工具的LWP系列),您可以找到如下文件名:

$ HEAD -S 'http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts'
HEAD http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts
302 Moved Temporarily
HEAD http://ubuntu.virginmedia.com/releases//precise/ubuntu-12.04-desktop-i386.iso
200 OK
Connection: close
Date: Tue, 01 May 2012 22:54:56 GMT
Accept-Ranges: bytes
ETag: "1f83678-2bd4b000-c175d600"
Server: Apache
Content-Length: 735358976
Content-Type: application/octet-stream
Last-Modified: Mon, 23 Apr 2012 12:27:04 GMT
Client-Date: Tue, 01 May 2012 22:54:54 GMT
Client-Peer: 194.117.143.72:80
Client-Response-Num: 1

302标题显示对象已移动,并且流提供了要检索的新URL。大多数工具都会透明地处理这个重定向,如果你手写HTTP,那么你也必须处理这个重定向。在这种情况下,您很幸运提供了一个名称 - 由于数据不需要来自文件,因此可能 文件名。但是,如果您的工具的上下文相对受限,这可能不是问题。

答案 1 :(得分:3)

更高效方式:

您只需连接到该网址,然后通过执行以下操作检索您重定向到的网址:

URL foo = new URL("http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts");
HttpURLConnection fooConnection = (HttpURLConnection) foo.openConnection();
URL secondFoo = new URL(fooConnection.getHeaderField("Location"));
fooConnection.setInstanceFollowRedirects(false);
URLConnection fooURL = secondFoo.openConnection();