web-dev-qa-db-ja.com

play2の他の入力でアップロードファイルを取得するにはどうすればよいですか?

HTMLでは、マルチパートデータを含むフォーム:

_<form action="@routes.Files.upload" method="post" enctype="multipart/form-data">
    <input type="hidden" name="groupId" value="1" />
    <input type="hidden" name="tagId" value="2" />
    <input type="file" name="file"/>
    <input type="submit" value="upload it"/>
</form>
_

アクションの書き方_Files upload_?

アップロードされたファイルを取得する方法を知っています:

_request.body.file("file") map {
    filepart => filepart.ref.moveTo(newFile);
}
_

そして、提出された入力を取得する方法:

_Form(Tuple("groupId" -> text, "tagId" -> text)).bindFromRequest.fold(
    errors => ...,
    params => ....
)
_

しかし、それらをどのように組み合わせるのですか?

fileに適した型がForm(Tuple(...))で使用できず、_request.body_で入力値を取得する方法も見つかりません。

25
Freewind

この答えはJava向けですが、Scalaにかなり簡単に適応できるはずです。

あなたがする必要があるのはあなたのフォームを除いてファイルのすべてのフィールドのためにモデルを定義することです。次に、通常どおりfile-uploadAPIを使用してファイルを取得します。

たとえば、これは私がしたことです:

フォーム(upload.scala.html内):

@form(action = routes.UploadResourceController.doUpload(), 'enctype -> "multipart/form-data") {

    @inputText(uploadForm("lang"))
    @inputText(uploadForm("country"))
    @inputFile(uploadForm("resourceFile"))

    <p>
        <input type="submit">
    </p>
}

モデル(models/UploadResource.Java):

public class UploadResource {
    @Required
    public String lang;

    @Required
    public String country;

    /* notice a field for the file is missing */
}

コントローラー(controllers/UploadResourceController.Java):

public static Result doUpload() {
    Form<UploadResource> filledForm = uploadForm.bindFromRequest();

    if (filledForm.hasErrors()) {
        return badRequest(views.html.upload.render(filledForm));
    } else {
        UploadResource resource = filledForm.get();
        MultipartFormData body = request().body().asMultipartFormData();
        FilePart resourceFile = body.getFile("resourceFile");

        /* Check resourceFile for null, then extract the File object and process it */
     }
}

これがお役に立てば幸いです。

27
JBCP

Scalaの例:フォームフィールドが必要な場合:

モデル:

case class Specs (userid: String)

コントローラー:

object Upload extends Controller {
   val uploadForm = Form(
         mapping(
               "userid" -> nonEmptyText
         )(Specs.apply)(Specs.unapply)
   )
   def upload = Action(parse.multipartFormData) { implicit request =>
      val sp : Option[Specs] = uploadForm.bindFromRequest().fold (
            errFrm => None,
            spec => Some(spec)
      )
      request.body.file("file").map { f =>
         sp.map { spec =>
            val filePath = ... // incorporate userid
            // XXX: file read to memory b4 writing to disk. bad for large files
            f.ref.moveTo(new File(filePath), replace=true)
            Ok("File uploaded")
         }.getOrElse{
            BadRequest("Form binding error.")
         }
      }.getOrElse {
         BadRequest("File not attached.")
      }
   }
}
13
virtualirfan

これを行う別の例は次のとおりです。

モデル:

case class Specs(userId: String)

コントローラー

def upload = Action(parse.multipartFormData) { implicit request => 
   uploadForm.bindFromRequest().fold(
   hasErrors => Ok(ourFormHTML(hasErrors),
   specs => {
      request.body.file("inputFileFieldName") match {
        case Some(file) => {
          import Java.io.File
          val filename = file.filename
          val contetType = file.contentType
          file.ref.moveTo(new File(Play.application().path().getAbsolutePath + file.filename))
          Ok("congratz you did it")
        }
        case _ => Ok(ourHTML if we dont send file but want the form anyway)
      }
   }


 )

何が悪かったのか疑問に思うかもしれないので、ファイルに名前を付けることを忘れないでください。

3

他のフォームパラメータを使用して、angularを使用してファイルをアップロードしていました。私は以下のように私のものを作成しました、そしてそれは働きます。

角度関数

Upload.upload({
    url: '/api/upload',
    method:'POST',
    data: {
        "file": user.profilePic, //file object
        "username": user.username

    }
}).then(function (resp) {
    //console.log('Success ' + resp.config.data.file.name + 'uploaded. Response: ' + resp.data);

}, function (resp) {
    console.log('Error status: ' + resp.status);
}, function (evt) {
    var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
    //console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
});

プレイ2.1コントローラー

/**
*
*Upload user profile 
**/
public static Result upload() {
    Logger.info("Uploading images##");
    Http.MultipartFormData body = request().body().asMultipartFormData();
    Http.MultipartFormData.FilePart profile = body.getFile("file");
    if (profile != null) {
        File file = profile.getFile();

        //upload file to a directory
        //todo

        //get the username from form
          Map<String,String[]> dataPart = request().body().asMultipartFormData().asFormUrlEncoded();
          String username = dataPart.get("username")[0];

          //save/update the details with ebean

        return ok("File uploaded");
    } else {

        return status(400, "Missing file");
    }
}
2
Ktonneh