play 2.1.1 でこれを試してみました 画像 (入力ファイル) 、説明 (入力テキスト) の 2 つのフィールドがあります。
@(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 を定義して入力ファイル フィールドに接続するにはどうすればよいですか? 私のコントローラーは multipart-data を受け取り、ファイルを取得できますが、エラーが発生した場合は検証で badrequest をスローします。
このような意味があることを願っています。