Spring:ファイルダウンロードでファイル名を設定するのに便利なクラス
Springフレームワークを利用している場合にファイルのダウンロードでContent-Dispositionヘッダーに日本語が含まれるファイル名を設定するのにContentDispositionクラスが便利です。
サンプルコード
以下はファイルをダウンロードするコントローラのサンプルです。
このサンプルはリクエストパラメータのfilename
に設定されたファイル名をContent-Dispositionレスポンスヘッダーに設定してテキストファイルをダウンロードします。
Content-Dispositionとは
Content-DispositionはRFC 6266で定義されていてコンテンツをブラウザーに表示させるかダウンロードさせるかを示すためのレスポンスヘッダーです。
RFC 6266 - Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)
Content-Disposionヘッダーに以下のようにattachment
と組み合わせてファイル名を指定することでブラウザに表示される「名前を付けて保存」ダイアログのデフォルトのファイル名を指定することができます。
Content-Disposition: attachment; filename="download.html"
ただし日本語のようにUS-ASCII以外の文字が含まれるファイル名をfilename
に指定した場合は正しくファイル名が設定されません。
例えば文字コードがUTF-8でファイル名が「ダウンロード.txt」の場合は以下のように指定する必要があります。
Content-Disposition: attachment; filename*=UTF-8''%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89.txt
この場合のファイル名のエンコードの方法はRFC 5987で定義されています。
RFC 5987 - Character Set and Language Encoding for Hypertext Transfer Protocol (HTTP) Header Field Parameters
ContentDispositionクラスの利用
SpringフレームワークではRFC6266で定義されているContent-Dispositionを表現するクラスが用意されています。
Spring Framework. Contribute to spring-projects/spring-framework development by creating an account on GitHub.
このクラスには目的ごとにビルダーを取得するビルダーメソッドが用意されています。今回のサンプルではこのクラスのattachment
ビルダーを利用してContent-Dispositionヘッダーにファイル名を設定しました。
.header(
HttpHeaders.CONTENT_DISPOSITION,
ContentDisposition.attachment()
.filename(filename + ".txt", StandardCharsets.UTF_8)
.build().toString())
ブラウザでの実行結果は以下です。
まとめ
Springフレームワークを利用していて日本語を含むファイル名のファイルをダウンロードする処理を作成する場合にContentDispositionクラスを利用すると便利です。