gpt4 book ai didi

scala - 从Play/Scala内存中的MultipartFormData中提取文件

转载 作者:行者123 更新时间:2023-12-04 05:40:09 25 4
gpt4 key购买 nike

我目前正在使用FileUploader Javascript实用程序在Play2/Scala中使用以下内容,将文件上传到我的服务器:

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文档或GridFS中。我意识到我可以从磁盘读取保存的文件,但是有没有办法在不先将文件缓存到磁盘的情况下从内存中处理所有这些文件呢?

此处的 Play 文档建议编写一个自定义的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

我已经搜索了很多,但是似乎找不到一个很好的例子。

最佳答案

未经测试MultipartBodyParsers对象为我们做了很多工作。我们需要做的第一件事是为FilePart编写一个处理程序。我在这里假设您希望文件包含一个Array[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, filename, contentType, bytes) => // do something
}
Ok("done")
}

上面的代码片段中的某些类型和方法很难找到。如果需要,这里是进口的完整 list :
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

关于scala - 从Play/Scala内存中的MultipartFormData中提取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15036121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com