5

Web サーバーからファイルをダウンロードし、サーバーがファイルと共に送信している元のファイル名で保存しようとしています。ダウンロードはうまくいきますが、実際のファイル名を取得できません。

実際の例として、このファイル(Foxit PDF Reader) をダウンロードしようとしています。

Chrome などのブラウザでこのリンクを使用している場合、ブラウザはバージョンなどを含む正確な名前でファイルをダウンロードします。この名前はどこから取得できますか? ヘッダー情報を読み取って検索しましContent-Dispositionたが、サーバーはこの情報を送信しません。正確なファイル名はどこから取得できますか?

私はこのようなことを試しました:

try {            
  URL webfile = new URL("http://www.foxitsoftware.com/downloads/latest.php?product=Foxit-Reader");
  URLConnection con = webfile.openConnection();
  Map map = con.getHeaderFields();
  Set set = map.entrySet();
  Iterator iterator = set.iterator();
  while (iterator.hasNext()) {
      System.out.println(iterator.next());
  }
} catch (IOException ex) {
  System.out.println("Error: "+ex.getMessage());
}

出力からわかるように、次のものはありませんContent-Disposition

null=[HTTP/1.1 200 OK]
ETag=["244005-f36d40-4d003f3868000"]
Date=[Sat, 08 Dec 2012 12:29:02 GMT]
Content-Length=[15953216]
Last-Modified=[Tue, 04 Dec 2012 10:01:36 GMT]
Content-Type=[application/x-msdos-program]
Connection=[close]
Accept-Ranges=[bytes]
Server=[Apache/2.2.16 (Debian)]

では、どうすれば正確なファイル名を取得できますか? ブラウザのリンクは、 という名前のファイルをダウンロードしますFoxitReader544.11281_enu_Setup.exe

何か案は?!

4

2 に答える 2

3
GET /downloads/latest.php?product=Foxit-Reader HTTP/1.1

の応答を返しますHTTP/1.1 302 Found

応答ヘッダーを設定します

Location: http://cdn04.foxitsoftware.com/pub/foxit/reader/desktop/win/5.x/5.4/enu/FoxitReader544.11281_enu_Setup.exe

そして最後に、次のように発行します。

GET /pub/foxit/reader/desktop/win/5.x/5.4/enu/FoxitReader544.11281_enu_Setup.exe HTTP/1.1

それがファイル名の由来のようです。そのため、リダイレクトが透過的に行われている場合でも、おそらくリクエスト パラメータからファイル名を取得できます。

于 2012-12-08T12:52:04.217 に答える
2

上記のURLをリクエストすると、サーバーは次のアドレスに302リダイレクトで応答します(ヘッダーキー:場所):http ://cdn04.foxitsoftware.com/pub/foxit/reader/desktop/win/5.x/5.4/enu /FoxitReader544.11281_enu_Setup.exeおよびFoxitReader544.11281_enu_Setup.exeは、元のリンクをクリックしたときにコンピューターに保存されるファイル名です。

于 2012-12-08T12:54:42.190 に答える