Liftで画像を表示する
Scalaをやってる人なら恐らく誰でも知っているであろう武田ソフトさんのブログの以下のエントリが元ネタ。
LiftでJCaptcha → Liftでバイナリデータをレスポンスする方法
分かる人はこのエントリだけで分かるんだろうけど、ちょっとあっさりし過ぎているので、自分が勉強用に作ったプログラムを簡略化して説明。
バイナリデータの出力
object ImageHandler def show(id: String): Box[LiftResponse] = { // ImageObjというクラスに必要な色々情報が入っているものとする。 val image: ImageObj = getImage(id) // 必要な情報の取得 val imageFormat = image.format.toLowerCase val imageLength = image.length val imageData = image.data // Array[Byte] // HTTPヘッダーの準備 val headers = ("Content-type" -> ("image/" + imageFormat)) :: ("Cache-Control" -> "no-store") :: ("Pragma", "no-cache") :: ("Expires", "0" ) :: ("Content-length" -> imageLength.toString) :: Nil // 出力 Full(StreamingResponse(new java.io.ByteArrayInputStream(imageData), () => {}, imageLength, headers, Nil, 200) ) } }
元のソースはこちら。
URLの設定
http://www.example.com/image/
にアクセスされたら、ImageHandler.show(id)が呼び出されるようにしたい。
LiftRules.statelessDispatchTable.append{ case Req( "image" :: id :: Nil, _, _ ) => () => ImageHandler.show(id) }
元のソースはこちら。