程序要求:
1.文件上传名不能为空,
2.文件上传的类型必须是java zip格式
文件上传大小必须是5M
第一种方法是通过javascript校验来限制,获取input的value然后截取扩展名进行判断即可。
第二种是根据struts2自带的fileupload拦截器中提供的allowedTypes来进行限制,步骤如下:
1 配置fileupload拦截器
struts.xml文件中的代码如下:
<struts>
<includefile="struts-constant.xml"/>
<packagename="user"namespace="/csdn"extends="struts-default">
<global-results>
<resultname="input">/index.jspresult>
global-results>
<actionname="FileAction_*"class="www.csdn.struts_upload_interceptor.action.FileAction"method="{1}">
<interceptor-refname="fileUpload">
<paramname="allowedTypes"> application/octet-stream,application/x-zip-compressed
param>
<paramname="maximumSize">5242880param>
interceptor-ref>
<interceptor-refname="defaultStack"/>
<resultname="success">/index.jspresult>
action>
package>
struts>
上面配置的是上传文件类型的限制,其实共有两个参数:
maximumSize (可选)- 这个拦截器允许的上传到action中的文件最大长度(以byte为单位).注意这个参数和在webwork.properties中定义的属性没有关系,默认2MB
allowedTypes (可选)- 以逗号分割的contentType类型列表(例如text/html),这些列表是这个拦截器允许的可以传到action中的contentType.如果没有指定就是允许任何上传类型.Tomcat/conf/web.xml文件中就有文件的类型的名称
文件大小的设置需在常量配置xml的文件中进行如下配置:
<constantname="struts.multipart.maxSize"value="5242880">constant>
2 jsp页面定义如下(testFileUpload.jsp)
<body>
上传文件<br>
<hr>
错误信息:
<s:fielderror>s:fielderror><br>
action错误信息:
<s:actionerror/>
<hr>
<div>
<form action="${pageContext.request.contextPath }/csdn/FileAction_upload.action"method="post"enctype="multipart/form-data">
文件上传:<inputname="upload"type="file"><br>
<inputtype="submit"value="上传">
form>
div>
body>
添加struts2标签:
<%@ tagliburi="/struts-tags"prefix="s"%>
3 后台的FileAction声明如下
public class FileAction extends ActionSupport {
private Filefile;//上传的文件
private StringcontentType;//文件类型
private Stringfilename;//文件名
private Stringpath;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public void setUpload(File file) {
this.file = file;
}
public void setUploadFileName(String filename) {
this.filename = filename;
}
public String upload()
{
//创建文件路径
String path=ServletActionContext.getServletContext().getRealPath("WEB-INF/uploads");
//上传路径的文件
File pfile=new File(path);
//文件的路径创建
if(!pfile.exists())
{
pfile.mkdirs();
}
try {
FileUtils.copyFile(file,new File(pfile,System.currentTimeMillis()+"_"+filename));
System.out.println("文件上传成功。。。。。。。。。。");
returnSUCCESS;
} catch (IOException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
return INPUT;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
}
注意:如果jsp中file的name="xxx",那么后台action中的属性要做相应更改为
private File xxx;
private String xxxContentType;
private String xxxFileName;
同时注意大小写一定要一致
4.文件名不能为空的问题:
在FileAction文件的同目录下,建一个FileAction-validation.xml,编写代码如下:
<fieldname="upload">
<field-validatortype="requiredstring">
<paramname="trim">trueparam>
<message>文件名不能为空message>
field-validator>
field>
运行效果图:
1
2.上传的文件类型不对,
3.文件名为空
出现的bug及解决:
bug:上传一个文件后,总会出现一个信息错误,即出现文件名不能为空的提示信息
bug的原因:文本框中的value值本来就是空的 所以文件名不能为空的问题不能在第4步中写,直接在Action中进行判断就可。
解决:在FileAction的upload方法中进行以下判断:
if("".equals(file) || file==null)
{
System.out.println("文件名不能为空");
}
再运行,程序则正常显示了,不会再出现文件名不能为空的信息。