2

プラグイン 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 を提供するようです。

リアクティブな方法で(一時ファイルを使用したり、本体をメモリに保存したりせずに)それを達成する方法がわかりませんでした。それはまったく可能ですか?

4

1 に答える 1