`
wiiln
  • 浏览: 151885 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

网购通


分享到:
评论

相关推荐

    struts2文件上传下载源代码

    在Struts2中,文件上传和下载是常见的功能需求,特别是在处理用户交互和数据交换时。这篇博客文章提供的"struts2文件上传下载源代码"旨在帮助开发者理解和实现这些功能。 文件上传功能允许用户从他们的设备上传文件...

    struts2 文件上传

    Struts2 文件上传是Web开发中的一个重要功能,它允许用户通过网页上传文件到服务器。Struts2 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,提供了丰富的特性和强大的控制层功能,使得文件上传...

    struts2文件上传jar

    这个压缩包包含了实现Struts2文件上传所需的全部jar包,这些库文件对于理解和实现文件上传功能至关重要。 首先,我们要了解Struts2文件上传的基本流程。当用户通过表单提交包含文件输入字段的请求时,Struts2框架会...

    简单易懂的struts2文件上传

    在Struts2中,文件上传功能是一个常见的需求,例如用户可能需要上传图片、文档或其他类型的文件。本教程将深入浅出地讲解如何在Struts2中实现文件上传,并提供一个简单的实例来帮助理解。 1. **Struts2文件上传概述...

    struts2文件上传

    Struts2 文件上传是Web开发中的一个重要功能,它允许用户从他们的本地计算机向服务器传输文件。在Struts2框架中,文件上传是通过特定的拦截器实现的,这些拦截器处理了文件上传请求并提供了安全性和大小限制。下面将...

    struts 2文件上传

    在Struts 2中,文件上传功能是通过使用Struts 2的插件机制来实现的,这使得开发者能够方便地处理用户上传的文件。下面将详细讨论Struts 2文件上传的相关知识点。 ### 1. Struts 2文件上传原理 文件上传是基于HTTP...

    Struts2文件上传带进度条页面无刷新

    "Struts2文件上传带进度条页面无刷新"的实现涉及多个技术点,包括Struts2的文件上传插件、AJAX异步通信以及前端进度条展示。 首先,Struts2的文件上传依赖于`struts2-upload-plugin`。这个插件扩展了Struts2的核心...

    Struts2之struts2文件上传详解案例struts011

    在这个"Struts2之struts2文件上传详解案例struts011"中,我们将深入探讨如何实现这一功能。 首先,我们需要了解Struts2中的Action类,它是处理用户请求的核心组件。为了支持文件上传,我们需要创建一个继承自`org....

Global site tag (gtag.js) - Google Analytics