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さんのこのページ。