Fre*_*ind 25 forms file-upload playframework-2.0
在html中,一个包含多部分数据的表单:
<form action="@routes.Files.upload" method="post" enctype="multipart/form-data">
<input type="hidden" name="groupId" value="1" />
<input type="hidden" name="tagId" value="2" />
<input type="file" name="file"/>
<input type="submit" value="upload it"/>
</form>
Run Code Online (Sandbox Code Playgroud)
怎么写动作Files upload?
我知道如何获取上传的文件:
request.body.file("file") map {
filepart => filepart.ref.moveTo(newFile);
}
Run Code Online (Sandbox Code Playgroud)
以及如何获得提交的输入:
Form(tuple("groupId" -> text, "tagId" -> text)).bindFromRequest.fold(
errors => ...,
params => ....
)
Run Code Online (Sandbox Code Playgroud)
但是如何将它们组合在一起?
我没有找到适合使用的类型,file也没有找到Form(tuple(...))输入值的方法request.body.
JBC*_*BCP 27
这个答案适用于Java,但您应该能够相当容易地将其适应Scala.
您需要做的是为表单中除文件之外的所有字段定义模型.然后正常使用文件上传API来检索文件.
例如,这就是我所做的:
表格(在upload.scala.html中):
@form(action = routes.UploadResourceController.doUpload(), 'enctype -> "multipart/form-data") {
@inputText(uploadForm("lang"))
@inputText(uploadForm("country"))
@inputFile(uploadForm("resourceFile"))
<p>
<input type="submit">
</p>
}
Run Code Online (Sandbox Code Playgroud)
Model(models/UploadResource.java):
public class UploadResource {
@Required
public String lang;
@Required
public String country;
/* notice a field for the file is missing */
}
Run Code Online (Sandbox Code Playgroud)
Controller(controllers/UploadResourceController.java):
public static Result doUpload() {
Form<UploadResource> filledForm = uploadForm.bindFromRequest();
if (filledForm.hasErrors()) {
return badRequest(views.html.upload.render(filledForm));
} else {
UploadResource resource = filledForm.get();
MultipartFormData body = request().body().asMultipartFormData();
FilePart resourceFile = body.getFile("resourceFile");
/* Check resourceFile for null, then extract the File object and process it */
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
vir*_*fan 13
Scala中需要表单字段的示例:
模型:
case class Specs (userid: String)
Run Code Online (Sandbox Code Playgroud)
控制器:
object Upload extends Controller {
val uploadForm = Form(
mapping(
"userid" -> nonEmptyText
)(Specs.apply)(Specs.unapply)
)
def upload = Action(parse.multipartFormData) { implicit request =>
val sp : Option[Specs] = uploadForm.bindFromRequest().fold (
errFrm => None,
spec => Some(spec)
)
request.body.file("file").map { f =>
sp.map { spec =>
val filePath = ... // incorporate userid
// XXX: file read to memory b4 writing to disk. bad for large files
f.ref.moveTo(new File(filePath), replace=true)
Ok("File uploaded")
}.getOrElse{
BadRequest("Form binding error.")
}
}.getOrElse {
BadRequest("File not attached.")
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11974 次 |
| 最近记录: |