2013-02-23 69 views
7

मैं वर्तमान में अपने सर्वर पर एक फ़ाइल अपलोड करने के लिए FileUploader जावास्क्रिप्ट सुविधा का उपयोग Play2/स्काला के साथ निम्न का उपयोग कर रहा Play2/स्काला में स्मृति में MultipartFormData से पुलिंग:फ़ाइलों

def fileUploader = Action(parse.multipartFormData) { request => 
    request.body.file("qqfile").map { picture => 
    import java.io.File 
    val filename = picture.filename 
    val contentType = picture.contentType 
    picture.ref.moveTo(new File("/tmp",filename)) 
    Ok(Json.toJson(Map("success" -> "true"))) 
    }.getOrElse { 
    Ok(Json.toJson(Map("error" -> "error occured"))) 
    } 
} 

मैं केवल के साथ काम कर रहा हूँ छोटी फाइलें (< 10 एमबी) और मैं मोंगो ड्राइवरों का उपयोग करके उन फ़ाइलों को सीधे मोंगो दस्तावेज़ या ग्रिडएफएस में लिखने के लिए कैस्बा का उपयोग करना चाहता हूं। मुझे एहसास है कि मैं डिस्क से सहेजी गई फाइल को पढ़ सकता हूं, लेकिन डिस्क पर फ़ाइल को बफर किए बिना स्मृति से इसे संभालने का कोई तरीका है?

प्ले प्रलेखन यहां एक कस्टम बॉडीपार्सर (http://www.playframework.com/documentation/2.1.0/ScalaFileUpload) लिखने की सिफारिश करता है लेकिन ऐसा कोई प्रलेखन प्रतीत नहीं होता है कि एक लिखने के बारे में कैसे जाना है। यह स्पष्ट नहीं था कि एपीआई/कार्यान्वयन स्कालडॉक्स से कैसे काम करता है। मैं MultiPartFormData स्रोत कोड की तलाश में देखने के लिए कि यह कैसे काम करने की कोशिश की, लेकिन मैं उनके Git रेपो में मिल नहीं कर पा रहे:

https://github.com/playframework/Play20/tree/master/framework/src/play/src/main/scala/play/api/mvc

मैं काफ़ी खोज की है, लेकिन नहीं कर पा रहे एक अच्छा उदाहरण खोजने के लिए।

+1

'multipartFormData' शरीर पार्सर यहां पाया जा सकता: https://github.com/playframework/Play20/blob/2.1.0/framework/ src/खेल/src/मुख्य/स्केला/खेल/API/MVC/ContentTypes.scala # L541 – EECOLOR

उत्तर

12

Untested BodyParsers की Multipart वस्तु हमारे लिए बहुत काम करता है। सबसे पहले हमें FilePart के लिए हैंडलर लिखने की आवश्यकता है। मुझे लगता है कि आप फ़ाइल भागों को Array[Byte] चाहते हैं। ताकि इसे उपयोग करने के लिए,

def multipartFormDataAsBytes:BodyParser[MultipartFormData[Array[Byte]]] = 
    multipartFormData(handleFilePartAsByteArray) 

उसके बाद, आप पर Action यह निर्दिष्ट करें::

def fileUploader = Action(multipartFormDataAsBytes) { request => 
    request.body.files foreach { 
    case FilePart(key, filename, contentType, bytes) => // do something 
    } 
    Ok("done") 
} 

कुछ प्रकार के और में तरीकों

def handleFilePartAsByteArray: PartHandler[FilePart[Array[Byte]]] = 
    handleFilePart { 
    case FileInfo(partName, filename, contentType) => 
     // simply write the data to the a ByteArrayOutputStream 
     Iteratee.fold[Array[Byte], ByteArrayOutputStream](
     new ByteArrayOutputStream()) { (os, data) => 
      os.write(data) 
      os 
     }.mapDone { os => 
      os.close() 
      os.toByteArray 
     } 
    } 

अगले कदम के लिए अपने शरीर को पार्सर परिभाषित करने के लिए है कोड के उपरोक्त टुकड़े खोजने के लिए थोड़ा मुश्किल हैं। यहाँ मामले में आयात की एक पूरी सूची है कि आप इसे की जरूरत है:

import play.api.mvc.BodyParsers.parse.Multipart.PartHandler 
import play.api.mvc.BodyParsers.parse.Multipart.handleFilePart 
import play.api.mvc.BodyParsers.parse.Multipart.FileInfo 
import play.api.mvc.BodyParsers.parse.multipartFormData 
import play.api.mvc.MultipartFormData.FilePart 
import play.api.libs.iteratee.Iteratee 
import java.io.ByteArrayOutputStream 
import play.api.mvc.BodyParser 
import play.api.mvc.MultipartFormData