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