3. 上传文件拦截器
3.1. FileUpload拦截器介绍
3.1.1. FileUpload拦截器介绍
FileUpload拦截器是Struts2预置的拦截器,见struts-default.xml第134行。
FileUpload拦截器被默认拦截器栈defaultStack引用,即我们不需要做任何配置,就可使用该拦截器,见struts-default.xml第275行。
FileUpload拦截器可以用于做文件上传。
3.1.2. FileUpload拦截器原理
FileUpload拦截器上传文件有如下步骤
1、FileUpload拦截器将表单中提交的文件,以临时文件的形式保存到服务器临时路径下。
2、FileUpload拦截器将该临时文件对象注入给Action,Action自主处理该临时文件,比如将文件重新命名并复制到固定路径下。
3、FileUpload拦截器删除临时文件。
3.2. FileUpload使用
3.2.1. FileUpload拦截器使用步骤
1、导包
导入包commons-io.jar
2、Action
定义File类型属性(如some),接收拦截器注入的临时文件对象。如果想获取原始文件名,要定义String类型属性,属性名为“File类型属性+FileName”(如someFileName),拦截器会自动给该属性注入原始文件名。
3、表单设置
表单必须满足method="post"以及enctype="multipart/form-data"两个条件,才能实现文件上传功能。
3.2.2. 注意事项
Struts2上传文件最大值默认限制为2097152B,即2M。该设置被定义在struts2-core-2.1.8.jar中,包org.apache.struts2下的default.properties中。
struts.multipart.maxSize=2097152
我们可以在struts.xml中重置该默认值。
<constant name="struts.multipart.maxSize" value="5000000"/>
4.4 完整代码
本案例的完整代码如下。
FileUtil完整代码:
packageutil;
importjava.io.BufferedInputStream;
importjava.io.BufferedOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
/**
* 文件处理工具
*/
public class FileUtil {
public static boolean copy(File src, File dest) {
BufferedInputStreambis = null;
BufferedOutputStreambos = null;
try {
bis = new BufferedInputStream(new FileInputStream(src));
bos = new BufferedOutputStream(new FileOutputStream(dest));
byte[] bts = new byte[1024];
intlen = -1;
while ((len = bis.read(bts)) != -1) {
bos.write(bts, 0, len);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
struts.xml完整代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<!-- 客户配置信息 -->
<package name="customer"
namespace="/customer" extends="struts-default">
<interceptors>
<!-- 注册拦截器 -->
<interceptor name="first"
class="interceptor.FirstInterceptor"/>
<interceptor name="second"
class="interceptor.SecondInterceptor"/>
<!-- 注册拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="first"/>
<interceptor-ref name="second"/>
</interceptor-stack>
</interceptors>
<!-- 设置当前包下所有Action默认引用的拦截器 -->
<default-interceptor-ref name="myStack"/>
<!-- 打开修改页面 -->
<action name="toUpdateCustomer" class="action.ToUpdateCustomerAction">
<!-- 引用拦截器 -->
<!--<interceptor-ref name="first"/> -->
<result name="success">
/WEB-INF/customer/update_customer.jsp
</result>
</action>
</package>
<!-- 设置上传文件最大值 -->
<constant name="struts.multipart.maxSize" value="5000000"/>
<!-- 文件上传示例 -->
<package name="demo" namespace="/demo" extends="struts-default">
<!-- 打开上传文件页面 -->
<action name="toUpload">
<result name="success">/WEB-INF/jsp/upload.jsp</result>
</action>
<!-- 上传文件 -->
<action name="upload" class="action.UploadAction">
<result name="success">/WEB-INF/jsp/ok.jsp</result>
<result name="error">/WEB-INF/jsp/error.jsp</result>
</action>
</package>
</struts>
UploadAction完整代码:
package action;
importjava.io.File;
import org.apache.struts2.ServletActionContext;
importutil.FileUtil;
/**
* 文件上传Action
*/
public class UploadAction {
/**
* 接收拦截器传入的临时文件
*/
private File some;
/**
* 接收拦截器注入的原始文件名
*/
private String someFileName;
publicString execute() {
if (some == null)
return "error";
// 将文件放于项目部署路径下的upload文件夹下
String path = "WEB-INF/upload/" + someFileName;
// 根据相对部署路径计算完整路径
path = ServletActionContext.getServletContext().getRealPath(path);
// 将临时文件复制到上述路径下
FileUtil.copy(some, new File(path));
return "success";
}
public File getSome() {
return some;
}
public void setSome(File some) {
this.some = some;
}
public String getSomeFileName() {
returnsomeFileName;
}
public void setSomeFileName(String someFileName) {
this.someFileName = someFileName;
}
}
upload.jsp完整代码:
<%@page pageEncoding="utf-8"%> <html> <head></head> <body> <!-- 上传文件对表单有2个要求: 1、method="post" 2、enctype="multipart/form-data" --> <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="some" /> <input type="submit" value="提交" /> </form> </body> </html>
ok.jsp完整代码:
<html> <head></head> <body> <h1>OK!</h1> </body> </html>
error.jsp完整代码:
<html> <head></head> <body> <h1 style="color:red">Error!</h1> </body> </html>