我如何知道 url 后面的文件名(不解析 url 及其“/”)。例如:
如果您使用浏览器访问此网址:
http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts
它解析为"ubuntu-12.04-desktop-i386.iso"。如何在 java 中检索此文件名以下载具有原始名称的文件?
谢谢
您可以使用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,那么您还必须处理此重定向。在这种情况下,您很幸运提供了一个名称——可能没有文件名,因为数据不需要来自文件。但如果你的工具的上下文相对受限,这可能不是问题。
您可以简单地连接到 URL,然后通过执行以下操作检索您被重定向到的 URL:
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();