在 play 2.1.1 上试过这个有两个字段:图片(输入文件),描述(输入文本),像这样:
@(pictureForm: Form[FileUpload])
@import helper._
@form(action = routes.Uploader.uploadSimple, 'enctype -> "multipart/form-data") {
@helper.inputFile(pictureForm("picture"))
@helper.inputText(pictureForm("description"))
<button type="submit" > submit </button>
}
在 fileupload-pojo 中将描述标记为 @required。如果验证失败(用户没有给出描述)并且错误请求被抛出,那么用户之前选择的输入文件选择就会消失。
我的控制器是这样工作的:
public static Result upload() {
Map<String, String> formData = new HashMap<String, String>();
MultipartFormData body = request().body().asMultipartFormData();
Map<String, String[]> result = body.asFormUrlEncoded();
FilePart picture = body.getFile("picture");
if (picture != null) {
formData.put("contentType", picture.getContentType());
File file = picture.getFile();
formData.put("picture", file.toString());
}
formData.put("description",result.get("description")[0]);
Form<FileUpload> uploadForm = Form.form(FileUpload.class).bind(formData);
if (uploadForm.hasErrors()) {
return badRequest(upload.render(uploadForm));
} else {
return ok("Got picture uploaded");
}
}
出于可用性目的,我不希望用户因为另一个字段的一个错误而填写图片选择。验证发生在 FileUpload 类中,因为我希望将其分开:
package models;
import java.util.ArrayList;
import java.util.List;
import play.data.validation.ValidationError;
public class FileUpload {
public String contentType;
public String description;
public String picture;
public List<ValidationError> validate() {
List<ValidationError> valErrors = new ArrayList<ValidationError>();
if (description == null || description.isEmpty())
valErrors.add(new ValidationError("description",
"Give a description."));
if (contentType != null && !contentType.isEmpty()) {
if (!(contentType.equals("image/jpeg") || contentType.equals("image/png")))
valErrors.add(new ValidationError("picture",
"Wrong format."));
} else {
valErrors
.add(new ValidationError("picture",
"No picture chosen."));
}
return valErrors.isEmpty() ? null : valErrors;
}
}
我需要在输入文件中获取选择的路径。如何定义 FileUpload 以将其与输入文件字段连接?我的控制器获取多部分数据,我可以获取文件,但如果出现错误,我会抛出一个错误的验证请求。
我希望这种说法是有道理的。