Playframework 2.0以降での静的ファイルへのRoutesの書き方

Playframeworkを触りだしたはいいもののRoutesの書き方でハマった。 標準で用意されているassetsは、起動時にあるものしか読み込んでくれない。 まあassetsだからそういうもんか。 じゃあ静的ファイルはどうやってRouteかけばいいんだ?

公式のドキュメントには、staticDirというのを書けと書いてある。 しかしどうもうまく動かない。

色々と探した結果、controllerで開いて返すことにした。 conf/routes

GET     /public/*name               controllers.Application.download(name)

app/controllers/Application.scala

  def download(name: String) = Action {
    val file = new File("./dir/%s".format(name))
    if(file.exists()){
      Ok.sendFile(
        content = file,
        inline = true
      )
    } else { //ファイルが存在しない場合はまえもって用意していた警告画像を出す
      Ok.sendFile(
        content = new File("./dir/404.png"),
        inline = true
      )
    }
  }

“/dir/subdir/filename.png”へのアクセスもこれでばっちり対処できる。 しかし、これだとキャッシュしてくれないんだろうか? 毎回ファイルを開くのアホらしいから、もうちょっといい方法を探す。

Written on July 31, 2013