k4200’s notes and thoughts

Programmer side of k4200

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)
    }

元のソースはこちら