4

このガイドによると、手動で html フォームを記述してファイルをアップロードできます。テキスト フィールド (名前や電子メールなど) を含む大きなフォームの一部として、ファイルのアップロードを処理したいと考えています。ここに私がしなければならないことがあります(かなり醜い):

def newUser = Action(parse.multipartFormData) { implicit request =>{   
    //handle file
    import play.api.mvc.MultipartFormData.FilePart
    import play.api.libs.Files.TemporaryFile

    var uploadSuccessful = true 
    var localPicture: FilePart[TemporaryFile] = null

    request.body.file("picture").map { picture =>
    localPicture = picture   }.getOrElse {
    uploadSuccessful = false   }

    //process the rest of the form
    signupForm.bindFromRequest.fold(
      errors => BadRequest(views.html.signup(errors)),
      label => {
        //file uploading code here(see guide), including error checking for the file.

        if(uploadSuccesful){
        User.create(label._1, label._2, label._3._1, 0, "NO PHOTO", label._4)
        Redirect(routes.Application.homepage).withSession("email" -> label._2)
        } else {
        Redirect(routes.Application.index).flashing(
        "error" -> "Missing file"
        }
      })
     }   }

これは私には非常に醜く見えます。すべてのフィールド (ファイルのアップロードを除く) を含む signupForm をどこかに定義したことに注意してください。私の質問は次のとおりです。これについてもっときれいな方法はありますか? おそらく、signupForm に file フィールドを含めてから、エラーを均一に処理することによります。

4

2 に答える 2

1

これまでのところ、バイナリデータをフォームに直接バインドすることはできないと思います。バインドできるのは参照(画像のIDや名前など)のみです。ただし、コードを少し再定式化することはできます。

def newUser() = Action(parse.multipartFormData) { implicit request => 
  import play.api.mvc.MultipartFormData.FilePart
  import play.api.libs.Files.TemporaryFile

  request.body.file("picture").map { picture =>
    signupForm.bindFromRequest.fold(
      errors => BadRequest(views.html.signup(errors)),
      label => {
        User.create(label._1, label._2, label._3._1, 0, picture.absolutePath(), label._4)
        Redirect(routes.Application.homepage).withSession("email" -> label._2)
      }
    )
  }.getOrElse(Redirect(routes.Application.index).flashing("error" -> "Missing file"))
}
于 2012-07-12T12:52:17.783 に答える
0

asFormUlrEncoded以下のように を使用できます。

def upload = Action(parse.multipartFormData) { request =>
  val formField1 = request.body.asFormUrlEncoded("formField1").head;
  val someOtherField = request.body.asFormUrlEncoded("someOtherField").head;
  request.body.file("photo").map { picture =>
    ...
  }
}
于 2013-02-04T17:34:13.657 に答える