Struts2实现文件上传:Struts2框架使用一个fileupload的interceptor来完成文件上传。(这里使用自带的commons-io-2.2.jar提供的FileUtils的copyFile()实现上传)
三个表单:
浏览器端注意事项:
表单提交方式method=post
表单中必须有一个<input type=”file”>组件
表单中必须设置enctype=”multipart/form-data”
三个变量:
private File upload; //上传的文件
private String uploadContentType; //上传文件的mimeType类型
private String uploadFileName;//上传文件的名称
单文件上传界面:
upload.jsp
<form action="${pageContext.request.contextPath }/up" method="post" enctype="multipart/form-data">
<input type="file" name="upload">
<input type="submit" value="上传">
</form>
多文件上传界面
uoloadLot.jsp
<form action="${pageContext.request.contextPath }/upLot" method="post" enctype="multipart/form-data">
<input type="file" name="upload"><br />
<input type="file" name="upload">
<input type="submit" value="上传">
</form>
Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 声明常量 -->
<!-- 可以帮助我们解决post请求乱码问题 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 配置这项后,它会提供更加详细报错信息,以及在struts.xml文件修改后不在需要重启服务器(推荐开启) -->
<constant name="struts.devMode" value="true"></constant>
<!-- 引入文件上传upload.xml -->
<include file="upload.xml"></include>
</struts>
upload.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="upload" namespace="/" extends="struts-default">
<!-- 自定义拦截器栈 -->
<interceptors>
<interceptor-stack name="myStack">
<interceptor-ref name="fileUpload">
<!-- 设置每一个action允许的上传文件大小 2M:(2097152) -->
<param name="maximumSize">209715200</param>
<!-- 设置上传允许的文件的mimeType类型,多个使用逗号分开 -->
<!-- <param name="allowedTypes"></param> -->
<!-- 设置上传文件允许的后缀名,多个使用逗号分开 -->
<!-- <param name="allowedExtensions">bmp,txt</param> -->
</interceptor-ref>
<!-- 引用Struts2默认拦截器,引用自定义拦截器后系统不加载Struts默认拦截器,需要手动加载 -->
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<!-- 单文件上传 -->
<action name="up" class="com.it.struts2.upload.action.UploadAction" method="uploadFile">
<!-- 出现自带拦截器发生的异常,会跳转到input视图界面提示错误,也有时候会提示连接被重置,这是tomcat的一种机制,本文提供了解决方案 -->
<result name="input">/error.jsp</result>
<!-- 引入自定义拦截器栈 -->
<interceptor-ref name="myStack" />
</action>
<!-- 多文件上传 -->
<action name="upLot" class="com.it.struts2.upload.action.UploadActionLot" method="uploadLot">
<result name="input">/error.jsp</result>
<!-- 引入自定义拦截器栈 -->
<interceptor-ref name="myStack" />
</action>
</package>
</struts>
UploadAction.java(单文件上传)
package com.it.struts2.upload.action;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport{
private File upload; //上传的文件
private String uploadContentType; //上传文件的mimeType类型
private String uploadFileName;//上传文件的名称
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
//上传文件的方法
public void uploadFile() throws Exception{
String path = ServletActionContext.getServletContext().getRealPath("/upload"); //得到upload目录在tomcat的绝对磁盘路径
//创建一个服务器端文件
File dest = new File(path, uploadFileName);
try {
//完成文件上传操作(调用copyFile方法)
FileUtils.copyFile(upload, dest);
} catch (IOException e) {
e.printStackTrace();
}
}
}
UploadActionLot.java(多文件上传)
package com.it.struts2.upload.action;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadActionLot extends ActionSupport {
private File[] upload;
private String[] uploadContentType;
private String[] uploadFileName;
public File[] getUpload() {
return upload;
}
public void setUpload(File[] upload) {
this.upload = upload;
}
public String[] getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String[] getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
}
// 上传文件
public void uploadLot() {
String path = ServletActionContext.getServletContext().getRealPath("/upload"); // 获得upload在tomcat下的绝对路径
try {
for (int i = 0; i < upload.length; i++) {
// 创建一个服务器端文件
File dest = new File(path, uploadFileName[i]);
// 完成文件上传
FileUtils.copyFile(upload[i], dest);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
默认拦截器出现异常或者错误的时候跳转的input界面:error.jsp
error.jsp
<body>
<s:actionerror />
<s:fielderror />
</body>
提示:有时候明明已经设置了错误跳转页面也会出现不跳转input错误视图的情况,网页提示:连接被重置。进行如下设置即可解决。在tomcat的安装目录找到,conf/server.xml修改Connector标签,增加maxSwallowSize="-1"属性。
总结:Struts2文件上传跟据“三个表单”和“三个变量 ”的原则,使用fileupload的interceptor来完成文件上传。当使用单文件和多文件上传时,可以将拦截器定义为一个拦截器栈(Interceptor-stack)。方便每个action进行引用。