1

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 をスローします。

このような意味があることを願っています。

4

1 に答える 1