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>