从Play2 / Scala内存中的MultipartFormData中提取文件
我目前正在使用以下Play2 /
Scala使用FileUploader
Javascript实用程序将文件上传到我的服务器:
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"))) } } 我只处理小文件(< 10MB),我想使用casbah使用Mongo驱动程序将这些文件直接写入Mongo Document或GridFS.我意识到我可以从磁盘读取保存的文件,但有没有办法从内存中处理这一切而不先在磁盘上缓冲文件? 这里的游戏文档建议编写一个自定义BodyParser(http://www.playframework.com/documentation/2.1.0/ScalaFileUpload),但似乎没有任何关于如何编写一个的文档.目前尚不清楚Scaladocs的API /实现是如何工作的.我尝试查找MultiPartFormData源代码以查看它是如何工作的,但我似乎无法在他们的Git仓库中找到它: https://github.com/playframework/Play20/tree/master/framework/src/play/src/main/scala/play/api/mvc 我搜索了很多,但似乎找不到一个很好的例子. 解决方法
未经测试
BodyParsers的Multipart对象为我们做了很多工作.我们需要做的第一件事就是为FilePart编写一个处理程序.我假设您希望文件部分为数组[Byte]. 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 } } 下一步是定义您的身体解析器: def multipartFormDataAsBytes:BodyParser[MultipartFormData[Array[Byte]]] = multipartFormData(handleFilePartAsByteArray) 然后,为了使用它,请在您的Action中指定它: def fileUploader = Action(multipartFormDataAsBytes) { request => request.body.files foreach { case FilePart(key,contentType,bytes) => // do something } Ok("done") } 上面的代码中的一些类型和方法有点难以找到.以下是您需要的完整导入列表: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |