プラグイン 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) }
}
残念ながら、次の理由により、このソリューションは私には合いません。
- DAO レイヤーのみをリアクティブ mongo に依存させたいと考えています。
- ユーザーが (SecureSocial で) 認証されている場合にのみファイルを保存し、一部のユーザーのプロパティをチェックおよびメタデータとして使用する必要があります。
- ユーザーが認証されていない場合、リクエスト本文はまったく解析されません (この質問も参照してください)。
それは線に沿ったものだろう
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)
...
}
}
残念ながら、リクエスト本文の解析から列挙子を取得する方法はないようです。唯一の方法は、アクションにパーサーと、解析されるボディが供給される Iteratee を提供するようです。
リアクティブな方法で(一時ファイルを使用したり、本体をメモリに保存したりせずに)それを達成する方法がわかりませんでした。それはまったく可能ですか?