插件play-reactivemongo提供了一种上传文件的简单方法:
def upload = Action(gridFSBodyParser(gridFS)) { request =>
val futureFile: Future[ReadFile[BSONValue]] = request.body.files.head.ref
futureFile.map { file =>
// do something
Ok
}.recover { case e: Throwable => InternalServerError(e.getMessage) }
}不幸的是,这个解决方案不适合我,因为:
这将是一些类似的东西
def upload = SecuredAction { request =>
val user = request.user
val enumerator = an enumrator from the body parsing ???
myDAO.saveFile(user, enumerator)
object myDAO {
def saveFile(user:User, enumerator:Enumerator[Array[Byte]]) = {
...
val fileToSave = DefaultFileToSave(...)
gridfs.save(enumerator, fileToSave)
...
}
}不幸的是,似乎无法从解析请求体中获得枚举数。唯一的方法似乎是为Action提供一个解析器和一个Iteratee,该解析器和Iteratee将与被解析的主体一起喂食。
我不知道如何以一种反应的方式实现它(不使用临时文件或将主体存储在内存中)。有可能吗?
发布于 2014-05-15 08:44:58
实际上,您可能会考虑根本不使用girdFS内置解析器:
val gfs = new GridFS(db)
// the controller method, Authenticated here is custom object extending ActionBuilder
def upload = Authenticated.async(parse.multipartFormData) { request =>
...
request.body.file("photo") match {
// handle error cases
...
case Some(photo) =>
val fileToSave = DefaultFileToSave(photo.filename, photo.contentType)
// here some more operations, basically you don't need the and need only photo.ref.file
val enumerator = Enumerator(Image(photo.ref.file).fitToWidth(120).write)
gfs.save(enumerator, fileToSave) map {
//handle responses and stuff
...
}
}
}
}https://stackoverflow.com/questions/23429359
复制相似问题