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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です