我怎么知道url背后的文件名(不解析url及其“/”)。例如:
如果您使用浏览器访问此网址:
http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts
它解析为“ubuntu-12.04-desktop-i386.iso”。如何在java中检索此文件名以下载具有原始名称的文件?
由于
答案 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();