Scala Play 2.0.2多文件上传

时间:2012-09-06 23:20:41

标签: scala playframework-2.0

我是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"
    )
  }
}

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

3 个答案:

答案 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")