2013-01-06 18 views
5

का उपयोग करके पोस्टग्रेज़ में छवियों को सहेजना/लोड करना मुझे लगता है कि मैं छवि को पोस्टग्रेस पर सही तरीके से सहेज रहा हूं, लेकिन छवि लोड करने की कोशिश कर रहे अप्रत्याशित परिणाम प्राप्त करें। मुझे वास्तव में पता नहीं है कि त्रुटि सहेजने या लोड में है या नहीं।एनार्म (स्कैला/प्लेफ्रेमवर्क 2)

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

}

... मैं "अद्यतन सफल", इसलिए मुझे लगता है सेव किया जाता है (मैं गलत हो सकता है) काम कर रहे:

यहाँ छवि को बचाने के लिए मेरी Anorm कोड है।

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 आउटपुट

मैं नहीं जानता कि बी है कि किस प्रकार [या जहाँ मैं गलत हो गया हो सकता है "[बी @ 11be1c6 अज्ञात प्रकार [बी है" ...

उत्तर

5

यह जावा में बाइट की एक सरणी (है बाइट [])। > "मुझे नहीं पता कि किस प्रकार [बी"।

और आप इस मामले में 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

धन्यवाद, काजुहिरो। मैंने "पंक्ति (कुछ (छवि: ऐरे [बाइट])) से मेल खाने का पहला विकल्प लिया"। मुझे इतनी स्पष्ट गलती करने में थोड़ा मूर्खता महसूस हुई। एक बार फिर धन्यवाद। –

संबंधित मुद्दे