使用Anorm在Postgres中保存/加载图像(Scala / PlayFramework 2)
发布时间:2020-12-16 18:15:52 所属栏目:安全 来源:网络整理
导读:我想我正在将图像正确保存到Postgres,但是尝试加载图像会得到意想不到的结果.我真的不知道错误是在保存还是加载. 这是我保存图像的Anorm代码: def storeBadgeImage(badgeHandle: String,imgFile: File) = { val cmd = """ |update badge |set img={imgBytes
我想我正在将图像正确保存到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(图像:数组[字节])”,而是进入“Row(Some(unknown:Any))”案例.我的println输出“[B @ 11be1c6未知类型是[B” 我不知道[B是什么类型或我可能出错的地方… 解决方法
它是Java中的一个字节数组(byte []). > “我不知道什么类型[B”.
你可以写匹配{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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |