如何在play2中使用其他输入获取上传文件?

Fre*_*ind 25 forms file-upload playframework-2.0

在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>
Run Code Online (Sandbox Code Playgroud)

怎么写动作Files upload

我知道如何获取上传的文件:

request.body.file("file") map {
    filepart => filepart.ref.moveTo(newFile);
}
Run Code Online (Sandbox Code Playgroud)

以及如何获得提交的输入:

Form(tuple("groupId" -> text, "tagId" -> text)).bindFromRequest.fold(
    errors => ...,
    params => ....
)
Run Code Online (Sandbox Code Playgroud)

但是如何将它们组合在一起?

我没有找到适合使用的类型,file也没有找到Form(tuple(...))输入值的方法request.body.

JBC*_*BCP 27

这个答案适用于Java,但您应该能够相当容易地将其适应Scala.

您需要做的是为表单中文件之外的所有字段定义模型.然后正常使用文件上传API来检索文件.

例如,这就是我所做的:

表格(在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>
}
Run Code Online (Sandbox Code Playgroud)

Model(models/UploadResource.java):

public class UploadResource {
    @Required
    public String lang;

    @Required
    public String country;

    /* notice a field for the file is missing */
}
Run Code Online (Sandbox Code Playgroud)

Controller(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 */
     }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.


vir*_*fan 13

Scala中需要表单字段的示例:

模型:

case class Specs (userid: String)
Run Code Online (Sandbox Code Playgroud)

控制器:

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.")
      }
   }
}
Run Code Online (Sandbox Code Playgroud)