2013-01-06 6 views
5

私は画像をPostgresに正しく保存していますが、予期しない結果が画像を読み込もうとしていると思います。エラーがセーブまたはロードされているかどうかはわかりません。ここでAnormを使ってPostgresに画像を保存/読み込む(Scala/PlayFramework 2)

は、画像を保存するための私のAnormコードです:

def storeBadgeImage(badgeHandle: String, imgFile: File) = { 
    val cmd = """ 
     |update badge 
     |set img={imgBytes} 
     |where handle = {badgeHandle} 
    """ 
    var fis = new FileInputStream(imgFile) 
    var imgBytes: Array[Byte] = Resource.fromInputStream(fis).byteArray 
    // at this point I see the image in my browser if I return the imgBytes in the HTTP response, so I'm good so far. 
    DB.withConnection { implicit c => 
    { 
    try { 
     SQL(cmd stripMargin).on("badgeHandle" -> badgeHandle, "imgBytes" -> imgBytes).executeUpdate() match { 
     case 0 => "update failed for badge " + badgeHandle + ", image " + imgFile.getCanonicalPath 
     case _ => "Update Successful" 
     } 
    } catch { 
     case e: SQLException => e.toString() 
    } 
    } 
} 

}

...私は「成功し更新」を得るので、私は(私が間違っている可能性)のセーブが働いていると推定します。

def fetchBadgeImage(badgeHandle: String) = { 
    val cmd = """ 
     |select img from badge 
     |where handle = {badgeHandle} 
    """ 
    DB.withConnection { implicit c => 
    SQL(cmd stripMargin).on("badgeHandle" -> badgeHandle)().map { 
     case Row(image: Array[Byte]) => { 
     "image = " + image 
     } 
     case Row(Some(unknown: Any)) => { 
     println(unknown + " unknown type is " + unknown.getClass.getName) //[[email protected] unknown type is [B 
     "unknown" 
     } 
    } 
} 

}

...ではなく、ケースに入る:ここに画像をロードするための私のコードである「行(画像:配列[バイト])は、」期待して、それが「行に入ります(いくつか(不明:任意)) "の場合。私のprintln出力「[未知のタイプが[BであるB 11be1c6 @」

私はBであるか、または私が間違っている可能性がどこどのタイプ[分からない...

答えて

5

それは(Javaではバイトの配列ですバイト[])。 > "私はどんなタイプ[B"]を知らない。

この場合でもmatch { case Row(Some(image: Array[Byte])) => }と書くことができます。

また、次のようにすることもできます。

val results: Stream[Array[Byte]] = SQL(cmd stripMargin) 
    .on("badgeHandle" -> "name")().map { row => row[Array[Byte]]("img") } 

...次のコンパイルエラーが発生しました。

<console>:43: error: could not find implicit value for parameter c: anorm.Column[Array[Byte]] 
      val res: Stream[Array[Byte]] = SQL(cmd stripMargin).on("badgeHandle" -> "name")().map { row => row[Array[Byte]]("img") } 

残念ながら、scala.Arrayはデフォルトではサポートされていません。あなたが他のタイプの方法を真似すれば、それは機能します。

implicit def rowToByteArray: Column[Array[Byte]] = { 
    Column.nonNull[Array[Byte]] { (value, meta) => 
    val MetaDataItem(qualified, nullable, clazz) = meta 
    value match { 
     case bytes: Array[Byte] => Right(bytes) 
     case _ => Left(TypeDoesNotMatch("...")) 
    } 
    } 
} 
val results: Stream[Array[Byte]] = SQL(cmd stripMargin) 
    .on("badgeHandle" -> "name")().map { row => row[Array[Byte]]("img") } 

https://github.com/playframework/Play20/blob/master/framework/src/anorm/src/main/scala/anorm/Anorm.scala

+0

、一弘、ありがとうございました。私は "Row(Some(image:Array [Byte]))")にマッチする最初のオプションを取った。そのような明白な間違いを少しばかげて感じました。再度、感謝します。 –

関連する問題