私はこのコードを持っています:
resp.addHeader("Content-Disposition", "inline; filename=" + fileName);
ファイル名が「a_b_c.doc」または「abc.doc」の場合、ダウンロードしたファイルの名前が正しく表示されます。ただし、ファイル名が「a b c .doc」の場合、ダウンロードされたファイルの名前は「a」のみです。
どうすればこれを解決できますか?
引用符を使用:
resp.addHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");
HTTP標準 に従って、文字列を二重引用符で囲み、引用符または円記号の前に単一の円記号を付けてエスケープします。
Content-Disposition: attachment; filename="Very \"interesting\" file \\ files.txt"
これにより、Very "interesting" file \ files.txt
として保存するように求められます。バックスラッシュの存在はフォルダを示唆するものではなく、バックスラッシュがファイル名の一部であることを示唆していることに注意してください(Linuxやその他のプラットフォームでは完全に有効ですが、Windowsではそうではありません)。
ファイル名をchr(34)
で引用すると動作します:
resp.addHeader("Content-Disposition", "inline; filename=" + chr(34) + fileName + chr(34));
次の手順が必要です。
+
の代わりにエンコードされたスペースとして%20
を使用するため、それらを手動で%20
)に置き換えます。コード:
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
正常にテストされました