6

我是 Play 和 scala 的新手。我的要求是提供一个浏览按钮,我们可以在其中选择多个文件并上传这些文件。这是我写的代码:

在 scala.html 文件中:

<input type="file" name="files" multiple="multiple" id="files" size="30">

在控制器中:

def upload = Action(parse.multipartFormData) { request =>
  request.body.file("files").map { picture =>
    import java.io.File
    val filename = picture.filename 
    val contentType = picture.contentType
    picture.ref.moveTo(new File("/tmp/picture"))
    Ok("File uploaded")
  }.getOrElse {
    Redirect(routes.Application.index).flashing(
      "error" -> "Missing file"
    )
  }
}

但我无法上传多个文件。知道这里有什么问题吗?

4

3 回答 3

3

首先你不需要

="multiple"

这等效地工作

<input type="file" name="files" multiple id="files" size="30">


要加载多个文件,在定义表单时必须具有该属性

enctype="multipart/form-data"

例如,如果使用助手

@helper.form(action = routes.MyController.submit(), 'enctype -> "multipart/form-data", 'id -> "myform")

或者如果你不是

<form action=... enctype="multipart/form-data" id="myform">

在您的控制器中,您想尝试这样的事情(对于 Java,我确信它在 Scala 中类似)

//Get all files bound to the form when submitted 
List<FilePart> plate_files = request().body().asMultipartFormData().getFiles();
//Get files from a specific name or id
FilePart myfile = request().body().asMultipartFormData().getFile("files");

然后您可以使用这些迭代 FilePart 对象

希望它在scala中相似

干杯

于 2012-09-20T20:50:33.730 回答
1

如果你喜欢,你也可以这样尝试:

def uploadFiles: Action[AnyContent] { request =>
  val files: Option[Seq[FilePart[TemporaryFile]]] = request.body.asMultipartFormData.map(_.files)
   val filesJavaIO: Option[Seq[File]] = files map { fileSeq => fileSeq map { file =>
    file.ref.moveTo(new File("/tmp/myFiles"))
  }
  }
Ok("File uploaded")

}
于 2015-11-09T10:50:04.397 回答
0

非常简单,只要看看这个工作代码 -

def uploadAll = Action(parse.multipartFormData) { implicit request =>
  val files = request.body.files.toArray
  files.foreach(file => {
    val filename = Paths.get(file.filename).getFileName
    file.ref.moveTo(Paths.get(s"C:/Users/tusharw/Documents/Play Uploads/$filename"), replace = true)
  })
  Ok("Files uploaded")
}

或者,正如@robor78 所说,这是更简单的方法 -

def uploadAll = Action(parse.multipartFormData) { implicit request =>
  request.body.files map { file =>
    file.ref.moveTo(Paths.get("C:/Users/tusharw/Documents/Play Uploads/"+file.filename), replace = true)
  }
  Ok("Files uploaded")
}

并添加multiple到您的输入中。而已!

请注意,这里Paths属于java.nio.file.Paths. 你可以new File("/somepath")改用。

于 2018-04-03T10:06:21.077 回答