Play2.0Scalaでファイルダウンロード
目的
play2.0Scalaでplay1の時にあったrenderBinaly的な事をしてcsvファイルをダウンロードしたかったので、調べた結果のまとめ。
参考
http://www.playframework.org/documentation/2.0/ScalaStream
とりあえず、このエントリ読むよりも上記公式情報を読むべき。 Serving files の項を読めば、ここでやる内容は十分。 英語が辛いとか、とりあえず動けばいい人だけ、ここから下を読んでください。
とりあえずダウンロード
play2.0 scalaでcsvファイルをダウンロードするサンプル
conf/routes
# Home page GET / controllers.Application.index GET /download controllers.Application.download
app/controllers/FileDownloadController.scala
package controllers import play.api._ import play.api.mvc._ import java.io.File object Application extends Controller { def index = Action { Ok(views.html.index("Your new application is ready.")) } def download = Action { val file = new File("hoge.csv") Ok.sendFile(file) } }
このサンプルだと、ダウンロードできるファイル名は、uriから
ファイル名そのままのdownload
となってしまう。hoge.csv
となります。
公式サイトだと、サンプルとしてPDFをダウンロードしているが、
This helper will also compute the Content-Type header from the file name, and add the Content-Disposition header to specify how the web browser should handle this response. The default is to ask the web browser to download this file by adding the header Content-Disposition: attachment; filename=fileToServe.pdf to the HTTP response.
とあるように、デフォルトはファイル名が自動で指定されるらしい。 なのに、ファイルがcsvだとうまくいかない。
ファイル名を指定
なぜか自動で解決してくれないので、明示的にファイル名を指定する。
app/controllers/FileDownloadController.scala
… object Application extends Controller { … def download = Action { val file = new File("hoge.csv") Ok.sendFile( content = file, fileName = _ => "fuga.csv" ) } }
こうすると、ダウンロード出来るファイル名をfuga.csv
のように、元のファイル名に関係なく指定する事が出来る。
一部、勘違いがあったので修正しました。 2013/01/12