我是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"
)
}
}
但我无法上传多个文件。知道这里有什么问题吗?
答案 0 :(得分: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中类似
干杯
答案 1 :(得分: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")
}
答案 2 :(得分: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")
。