web-dev-qa-db-ja.com

Content-Dispositionヘッダーにスペースを含むファイル名を設定する方法

私はこのコードを持っています:

resp.addHeader("Content-Disposition", "inline; filename=" + fileName);

ファイル名が「a_b_c.doc」または「abc.doc」の場合、ダウンロードしたファイルの名前が正しく表示されます。ただし、ファイル名が「a b c .doc」の場合、ダウンロードされたファイルの名前は「a」のみです。

どうすればこれを解決できますか?

42
Huy Than

引用符を使用:

resp.addHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");
66
Moritz Petersen

HTTP標準 に従って、文字列を二重引用符で囲み、引用符または円記号の前に単一の円記号を付けてエスケープします。

Content-Disposition: attachment; filename="Very \"interesting\" file \\ files.txt"

これにより、Very "interesting" file \ files.txtとして保存するように求められます。バックスラッシュの存在はフォルダを示唆するものではなく、バックスラッシュがファイル名の一部であることを示唆していることに注意してください(Linuxやその他のプラットフォームでは完全に有効ですが、Windowsではそうではありません)。

11
Malvineous

ファイル名をchr(34)で引用すると動作します:

resp.addHeader("Content-Disposition", "inline; filename=" + chr(34) + fileName + chr(34));
0
Raphaël

次の手順が必要です。

  • RI-encodeファイル名
  • スペースを置き換えるエンコードされたファイル名で(URIエンコーダーの代わりにURLエンコーダーを使用していますが、URLエンコードは+の代わりにエンコードされたスペースとして%20を使用するため、それらを手動で%20)に置き換えます。
  • ヘッダーにエンコードされたファイル名を設定。ここには2つのバリアントがあります。1つはエンコードを指定するもの、もう1つは指定しないものです。最大限の互換性のために、両方を指定できます。

コード:

String fileName = ...;
String encodedFileName = URLEncoder.encode(fileName, 
    StandardCharsets.UTF_8.name()).replace("+", "%20");

response.setHeader("Content-Disposition", 
    String.format("inline; filename*=UTF-8''%1$s; filename=%1$s", encodedFileName));

ヘッダーの例:inline; filename*=UTF-8''Hello%20World.doc; filename=Hello%20World.doc

正常にテストされました

  • Firefox✔
  • クロム✔
  • エッジ✔
  • Internet Explorer✔
0
Peter Walser