有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓在Java中获取友好url后面的文件名

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

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

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

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

谢谢


共 (2) 个答案

  1. # 1 楼答案

    您可以使用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,那么你也必须处理这个重定向。在这种情况下,幸运的是,提供的名称可能不是文件名,因为数据不需要来自文件。但是,如果工具的上下文相对受限,这可能不是问题

  2. # 2 楼答案

    效率更高的方法是:

    您只需连接到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();