URLの背後にあるファイル名を知るにはどうすればよいですか(URLとその「/」を解析しません)。例えば:
ブラウザでこの URL にアクセスした場合:
http://www.ubuntu.com/start-download?distro=desktop&bits=32&release=lts
「ubuntu-12.04-desktop-i386.iso」に解決されます。元の名前のファイルをダウンロードするために、Javaでこのファイル名を取得するにはどうすればよいですか?
ありがとう
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 を手書きしている場合は、このリダイレクトも処理する必要があります。この場合、名前が提供されていることは幸運です。データはファイルから取得する必要がないため、ファイル名がない場合があります。ただし、ツールのコンテキストが比較的制限されている場合、これは問題にならない可能性があります。
次の手順を実行することで、単純に 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();