Struts2文件上传

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版)

网购通


你可能感兴趣的:(apache,spring,jsp,struts,企业应用)