Struts2使用开源项目Apache Jakarta Commons FileUpload和内建的FileUploadInterceptor拦截器实现文件上传,所需的jar包如下:
commons-logging-1.1.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.6.jar
xwork-2.0.1.jar
commons-io-1.3.1.jar
commons-fileupload-1.2.jar
★ 文件上传页面 fileupload.jsp
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<head>
<body>
<s:form action="fileUpload" method="post" enctype="multipart/form-data">
<s:file name="doc" label="File"/>
<s:submit/>
<s:form>
<body>
<html>
这里需要注意的是,form的enctype属性必须设置为multipart/form-data。
★ 处理文件上传 FileUploadAction.java
package fileupload;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport implements ServletContextAware {
private static final long serialVersionUID = -5016873153441103539L;
private File doc;
private String fileName;
private String contentType;
private ServletContext context;
public void setDoc(File file) {
this.doc = file;
}
public void setDocFileName(String fileName) {
this.fileName = fileName;
}
public void setDocContentType(String contentType) {
this.contentType = contentType;
}
public void setServletContext(ServletContext context) {
this.context = context;
}
public String execute() throws Exception {
String targetDirectory = context.getRealPath("/upload");
String targetFileName = generateFileName(fileName);
File target = new File(targetDirectory, targetFileName);
FileUtils.copyFile(doc, target);
return SUCCESS;
}
private String generateFileName(String fileName) {
DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
String formatDate = format.format(new Date());
int random = new Random().nextInt(10000);
int position = fileName.lastIndexOf(".");
String extension = fileName.substring(position);
return formatDate + random + extension;
}
}
在fileupload.jsp中,只有doc一个字段,而FileUploadAction.java中,却有三个字段,Struts2怎么通过页面的一个字段设置Action里的三个字段呢?没错,这就是FileUploadInterceptor的功劳了!你所要做的只是按照一定的样式命名这三个字段的set方法,而字段名可以任意命名。第一个File类型的字段的set方法还是以常规的方式命名,另两个String类型的字段的set方法必须分别以“File字段的set方法名+FileName”和“File字段的set方法名+ContentType”来命名。
下载两个开发包: commons-fileupload 和 commons-io(这个在应用commons-fileupload时会用到).这两个开发包(jar文件)官方下载:
到 http://commons.apache.org/downloads/download_fileupload.cgi 下载 commons-fileupload-1.2.jar 组件包.
到 http://commons.apache.org/downloads/download_io.cgi 下载 commons-io-1.3.2 组件包.
上传文件大小限制
错误:org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (2359629) exceeds the configured maximum (2097152)
这个最大值是在struts2的源文件“struts2-core-2.0.11.1.jar\org\apache\struts\ default.properties”中的struts.multipart.maxSize=2097152语句,如果想改大的话,就重新设定它,有两种方法:一种是重写:struts.properties文件,二是在struts.xml中加入常量来改变它如“
Java代码
<constant name="struts.multipart.maxSize" value="10000000" />”
当然了,也有struts2的拦截器可以限制文件的类型、大小等,但是当上传文件大小2M后,这个拦截器就不起作用了,只用小于2M(默认大小)的时候才起作用。那是因为:common-fileupload组件默认最大支持上传文件的大小为2M,当我们上传大于2M的文件时,就会出现上面所说的异常。是这个异常的发生导致了fileUpload拦截器没有机会执行,所以看到的是页面没有任何变化,也没有任何提示信息,只是在控制台打印出了上面的那些上传文件过大的异常
拦截器实现文件过滤 通过自身的拦截器来实现
配置fileUpload拦截器时,可以为其指定两个参数:
allowedTypes:该参数指定允许上传的文件类型,多个文件类型之间以英文逗号(,)隔开。
maximumSize:该参数指定允许上传的文件大小,单位是字节。
通过配置fileUpload的拦截器,可以更轻易的实现文件过滤,当文件过滤失败后,系统自动转入input逻辑视图,因此必须为该Action配置名为input的逻辑视图。除此之外,还必须显式地为该Action配置defaultStack的拦截器引用。
通过拦截器来实现文件过滤的配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定Struts2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 指定国际化资源文件的baseName为globalMessages -->
<constant name="struts.custom.i18n.resources" value="globalMessages"/>
<!-- 设置该应用使用的解码集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 配置处理文件上传的Action -->
<action name="upload" class="lee.UploadAction">
<!-- 配置fileUpload的拦截器 -->
<interceptor-ref name="fileUpload"> 引用了这个拦截器的哦。配置加入参数
<!-- 配置允许上传的文件类型 -->
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<!-- 配置允许上传的文件大小 -->
<param name="maximumSize">2000</param>
</interceptor-ref> <!--千万不可少了这一项哦!-->
<interceptor-ref name="defaultStack"/>
<!-- 动态设置Action的属性值 -->
<param name="savePath">/upload</param>
<!-- 配置Struts2默认的视图资源 -->
<result>/succ.jsp</result>
<!-- 配置该应用的input逻辑视图 -->
<result name="input">/upload.jsp</result>
</action>
</package>
</struts>
上面的拦截器过滤不仅过滤了文件的类型,也过滤了文件大小。上传文件的类型只能是图片文件,且文件大小不能大于2000字节(当然,我们随时可以更改到更大)。如果我们上传文件的文件太大,系统将转入input的逻辑视图,也就是/upload.jsp页面。
通过配置拦截器可以轻松实现哈哈!
Java软件工程师推荐书籍:
开发者突击:Struts 2核心技术与Java EE框架整合开发实战
轻量级Java EE企业应用实战——Struts 2+Spring+Hibernate
JAVA核心技术卷II:高级特性
全新正版《Java程序设计应用基础教程》石号仓
Java编程思想(第4版)
网购通