Liftで画像表示
タイトル通りだけど、<img src="foo.jpg" />とかそう言う話ではなく、DB内やファイルシステムにある画像ファイルを読み込んで、それをブラウザに出力する方法。以前、アップロードされた画像をDBに格納する方法についてエントリを書いたので、それと併せて読むといいかも。
■環境
- Lift 2.2 (古いバージョンでも基本は一緒のはず)
- Scala 2.8
■やりたい事
DBでもファイルシステムでもいいんで、どっかに画像が格納されているとする。
http://lift.example.com/image/xx
にアクセスすると、IDがxxの画像が表示されるようにしたい。
■ルール(?)の登録
Boot.scalaに以下の記述を追加。/image/<id> にアクセスすると、ImageHandler.show(id) が呼ばれる。
LiftRules.statelessDispatchTable.append{
case Req( "image" :: id :: Nil, _, _ ) =>
() => ImageHandler.show(id)
}
■画像の表示
DBから画像を読み込んで、バイナリストリームとして出力。
object ImageHandler {
def show(id: String): Box[LiftResponse] = {
// DBからデータの取得
ModelFoo.find(By(ModelFoo.id, id.toLong)) match {
case Full(modelFoo) if (modelFoo.imageFormat.is != null) => {
// HTTPヘッダー
val headers = ("Content-type" -> ("image/" + modelFoo.imageFormat.toLowerCase)) ::
("Cache-Control" -> "no-store") ::
("Pragma", "no-cache") ::
("Expires", "0" ) ::
("Content-length" -> modelFoo.image.length.toString) :: Nil
// バイナリストリームを返す
Full(StreamingResponse( new java.io.ByteArrayInputStream(modelFoo.image.get),
() => {}, modelFoo.image.length, headers, Nil, 200) )
}
case _ => Empty
}
}
}
■その他
参考にしたのは、ご存知、takedasoftさんのこのページ。