3

URLの背後にあるファイル名を知るにはどうすればよいですか(URLとその「/」を解析しません)。例えば:

ブラウザでこの URL にアクセスした場合:

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

「ubuntu-12.04-desktop-i386.iso」に解決されます。元の名前のファイルをダウンロードするために、Javaでこのファイル名を取得するにはどうすればよいですか?

ありがとう

4

2 に答える 2

3

HEADrequest 動詞を使用して、データの発見を試みることができます。この特定のファイル (および 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 を手書きしている場合は、このリダイレクトも処理する必要があります。この場合、名前が提供されていることは幸運です。データはファイルから取得する必要がないため、ファイル名がない場合があります。ただし、ツールのコンテキストが比較的制限されている場合、これは問題にならない可能性があります。

于 2012-05-01T22:57:38.067 に答える
3

より効率的な方法:

次の手順を実行することで、単純に 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();
于 2012-05-01T22:57:53.550 に答える