1

在 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 以将其与输入文件字段连接?我的控制器获取多部分数据,我可以获取文件,但如果出现错误,我会抛出一个错误的验证请求。

我希望这种说法是有道理的。

4

1 回答 1

0

这是解决它的一种方法(大致):

向表单添加可选路径:

public class FileUpload {
   public String path;
   //...
}

现在,当您解析表单时,在表单中添加上传文件的路径:

FilePart picture = body.getFile("picture");

if (picture != null) {
    //...
    formData.put("path", picture.getRelativePath());
}

为了确保在请求之间将此路径发送回服务器,您可以将其放入隐藏输入中:

@form(action = routes.Uploader.uploadSimple, 'enctype -> "multipart/form-data") {
    @*...*@
    <input type="hidden" name="path" value="@pictureForm.data.get("path")" />
}

最后,在验证表单时,除了检查是否有上传的图片之外,您现在还必须包括图片已经上传并且上传图片的路径在path.

为了提高可用性,您还可以在pictureForm.

于 2013-07-22T09:25:05.147 回答