处理文件上传
在form中指定multipart/form-data属性上传文件
上传文件的标准方式是指定form的一个特殊属性 multipart/form-data ,可以让你混合表单数据和表单文件附件。
开始编写HTML表单:
1@form(action = routes.Application.upload, 'enctype -> "multipart/form-data") { 2 3 <input type="file" name="picture"> 4 5 <p> 6 <input type="submit"> 7 </p> 8 9}
定义 upload action,使用 multipartFormData body parser:
1def upload = Action(parse.multipartFormData) { request => 2 request.body.file("picture").map { picture => 3 import java.io.File 4 val filename = picture.filename 5 val contentType = picture.contentType 6 picture.ref.moveTo(new File("/tmp/picture")) 7 Ok("File uploaded") 8 }.getOrElse { 9 Redirect(routes.Application.index).flashing( 10 "error" -> "Missing file" 11 ) 12 } 13}
ref 给予你一个指向 TemporaryFile 的引用。这是 mutipartFormData parser 处理文件上传的基本方式。
注意:你也可以使用 anyContent body parser 并以request.asMultipartFormData取出内容。
直接上传文件
另一种方式是使用ajax上传文件。这种情况下,form不需要设置编码为 multipart/form-data。
这种情况下,我们只需要使用一个 body parser 將 request body 保存到一个文件中。例如,我们使用 temporaryFile body parser:
1def upload = Action(parse.temporaryFile) { request => 2 request.body.moveTo(new File("/tmp/picture")) 3 Ok("File uploaded") 4}
自定义 body parser
如果你想直接处理上传的文件,而不是放入临时文件中缓冲,那么你需要编写自定义的 body parser。这种情况下,你將接到数据块,放于任何你期望的地方。
如果你想使用 multipart/form-data 编码,你仍然可以使用默认的 mutipartFormData parser并提供自定义的PartHandler[FilePart[A]]。