关于struts2的文件上传非空校验

blogzhoubo 2010-11-14
大家都知道,用struts2的fileUpload拦截器可以对上传文件的大小和类型进行校验,但是好像没有对文件选择框的非空校验(JSP页面里什么文件也不选择,直接提交表单)。所以让Action类继承ActionSupport类,在重写的validate()方法里进行非空校验。但是有一个问题就是,当拦截器的校验没有通过的时候(如:文件过大或者文件类型不对),仍然会调用validate()方法,这时因为file对象被拦截器置为null了,所以即使在JSP页面里选择了文件,validate仍然会认为是没有选择文件。
现在的解决方法是:在判断file是否为空之前,先检测一下是否已经有fielderror被加入Map里了。不知各位有没有别的更好的方法?

UploadAction.java:

public class UploadAction extends ActionSupport{
         private File file;
public File getFile() {
return file;
}

public void setFile(File file) {
this.file = file;
}

     public void validate(){
       if(getFieldErrors().isEmpty()){

if(file == null){
this.addFieldError("file",this.getText("file.required"));
}
       }     }

upload.jsp:

<body>
<s:form action="upload" method="post" enctype="multipart/form-data"
namespace="/">
<tr>
<td>上传文件:<s:file name="file"></s:file></td>
</tr>
<tr>
<td><s:submit name="submit" value="提交"></s:submit></td>
</tr>
</s:form>
</body>
songqi1984 2010-11-16
不知可不可以用jquery.validate.min.js脚本实现。
$('file').validate({
			rules: {file: "required"},
			messages: {file: "请选择上传文件"}
		});
forchase 2010-11-19
直接通过配置文件验证更简单,假如你的Action名是A,方法名是B,那么配置文件名可以这么写:
A-B-validation.xml

验证文件是否为空的部分:
<field name="file">
  <field-validator type="required" short-circuit="true">
  <message>请选择要上传的文件</message>
</field-validator>
Global site tag (gtag.js) - Google Analytics