![](/img/trans.png)
[英]Corrupted data when using LockBits/UnlockBits after saving and loading images
[英]Saving / Loading Images in Postgres using Anorm (Scala/PlayFramework 2)
我認為我已將圖像正確保存到Postgres,但是嘗試加載圖像時會得到意外的結果。 我真的不知道錯誤是否在保存或加載中。
這是我保存圖像的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) //[B@11be1c6 unknown type is [B
"unknown"
}
}
}
}
...而不是像希望的那樣進入“ Row(image:Array [Byte])”情況,而是進入“ Row(Some(unknown:Any))”情況。 我的println輸出“ [B @ 11be1c6未知類型為[B”
我不知道[B是什么類型,或者我可能在哪里出錯了...
它是Java(byte [])中的字節數組。 >“我不知道[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") }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.