`
scnujie
  • 浏览: 127750 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Struts2中的文件上传

阅读更多
struts2 文件上传

(1)  单文件上传 

一.简介

Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。
Struts2默认使用的是Jakarta的Common-FileUpload框架来上传文件,因此,要在web应用中增加两个Jar文件:commons-fileupload-1.2.jar和commons-io-1.3.1.jar。它在原上传框架上做了进一步封装,简化了文件上传的代码实现,取消了不同上传框架上的编程差异。
如果要改成其它的文件上传框架,可以修改struts.multipart.parser常量的值为cos/pell,默认值是jakata。并在classpath中增加相应上传组件的类库

例如配置成cos上传

struts.multipart.parser=cos

struts.multipart.maxSize=1024  指定文件的最大字结数

二.原理

不管用common-fileUPload框架,还是用cos,都是通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。

三.需要的jar包(默认使用commons-fileupload,如果使用cos,要将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

四.实例

1.首先,创建上传页面

Html代码
<%@page language="java" contentType = "text/html; charset=utf-8" pageEncoding = "utf-8"%>    
<%@taglib prefix="s" uri ="/struts-tags"%>    
  
  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
  <head>  
  
    <title>My JSP 'FileUpload.jsp' starting page</title>  
       
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">       
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
    <meta http-equiv="description" content="This is my page">  
    <!--  
    <link rel="stylesheet" type="text/css" href="styles.css">  
    -->  
  
  </head>  
     
  <body>  
   <s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data">    
        <s:fielderror />  
        <s:file name ="upload"/>      
        <s:submit />    
    </s:form >    
  
  </body>  
</html>  


<%@page language="java" contentType = "text/html; charset=utf-8" pageEncoding = "utf-8"%> 
<%@taglib prefix="s" uri ="/struts-tags"%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>My JSP 'FileUpload.jsp' starting page</title>
    
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->

  </head>
  
  <body>
   <s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data"> 
                <s:fielderror />
        <s:file name ="upload"/>   
        <s:submit /> 
    </s:form > 

  </body>
</html>


2.action

Java代码
package com;   
  
import java.io.BufferedInputStream;   
import java.io.BufferedOutputStream;   
import java.io.File;   
import java.io.FileInputStream;   
import java.io.FileOutputStream;   
import java.io.InputStream;   
import java.io.OutputStream;   
import java.util.Date;   
  
import org.apache.struts2.ServletActionContext;   
  
import com.opensymphony.xwork2.ActionSupport;   
  
public class FileUploadAction extends ActionSupport {   
       
    private static final long serialVersionUID = 572146812454l;   
  
    private File upload;   
  
    private String uploadContentType;   
  
    private String uploadFileName;   
  
    private String imageFileName;   
  
    public String getUploadContentType() {   
        return uploadContentType;   
    }   
  
    public void setUploadContentType(String uploadContentType) {   
        this.uploadContentType = uploadContentType;   
    }   
  
    public File getUpload() {   
        return upload;   
    }   
  
    public void setUpload(File upload) {   
        this.upload = upload;   
    }   
  
    public String getUploadFileName() {   
        return uploadFileName;   
    }   
  
    public void setUploadFileName(String uploadFileName) {   
        this.uploadFileName = uploadFileName;   
    }   
  
    public void setImageFileName(String imageFileName) {   
        this.imageFileName = imageFileName;   
    }   
  
    public String getImageFileName() {   
        return imageFileName;   
    }   
  
    private static void copy(File src, File dst) {   
        try {   
            InputStream in = null;   
            OutputStream out = null;   
            try {   
                in = new BufferedInputStream(new FileInputStream(src));   
                out = new BufferedOutputStream(new FileOutputStream(dst));   
                byte[] buffer = new byte[1024*10];   
                while (in.read(buffer) > 0) {   
                    out.write(buffer);   
                }   
            } finally {   
                if (null != in) {   
                    in.close();   
                }   
                if (null != out) {   
                    out.close();   
                }   
            }   
        } catch (Exception e) {   
            e.printStackTrace();   
        }   
    }   
  
    @Override  
    public String execute() {   
        System.out.println(uploadFileName);   
           
        imageFileName = System.currentTimeMillis() + uploadFileName.substring(uploadFileName.lastIndexOf("."));   
        File imageFile = new File(ServletActionContext.getServletContext()   
                .getRealPath("/uploadImages")   
                + "/" + imageFileName);   
        copy(upload, imageFile);   
        return SUCCESS;   
    }   
  
}  

package com;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport {
        
        private static final long serialVersionUID = 572146812454l;

        private File upload;

        private String uploadContentType;

        private String uploadFileName;

        private String imageFileName;

        public String getUploadContentType() {
                return uploadContentType;
        }

        public void setUploadContentType(String uploadContentType) {
                this.uploadContentType = uploadContentType;
        }

        public File getUpload() {
                return upload;
        }

        public void setUpload(File upload) {
                this.upload = upload;
        }

        public String getUploadFileName() {
                return uploadFileName;
        }

        public void setUploadFileName(String uploadFileName) {
                this.uploadFileName = uploadFileName;
        }

        public void setImageFileName(String imageFileName) {
                this.imageFileName = imageFileName;
        }

        public String getImageFileName() {
                return imageFileName;
        }

        private static void copy(File src, File dst) {
                try {
                        InputStream in = null;
                        OutputStream out = null;
                        try {
                                in = new BufferedInputStream(new FileInputStream(src));
                                out = new BufferedOutputStream(new FileOutputStream(dst));
                                byte[] buffer = new byte[1024*10];
                                while (in.read(buffer) > 0) {
                                        out.write(buffer);
                                }
                        } finally {
                                if (null != in) {
                                        in.close();
                                }
                                if (null != out) {
                                        out.close();
                                }
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        @Override
        public String execute() {
                System.out.println(uploadFileName);
                
                imageFileName = System.currentTimeMillis() + uploadFileName.substring(uploadFileName.lastIndexOf("."));
                File imageFile = new File(ServletActionContext.getServletContext()
                                .getRealPath("/uploadImages")
                                + "/" + imageFileName);
                copy(upload, imageFile);
                return SUCCESS;
        }

} 


表单的enctype ="multipart/form-data,与一般的上传一样.

<s:file name="upload">会将upload绑定到action的upload,其次他还会将上传记文件的MIME类型绑定到uploadContentType,文件名绑定到uploadFileName中,他们是通过

setUploadContentType和setUploadFileName进行绑定的,下面进行的多文件上传也是同个道理,不过要用数组或者是list来进行绑定,然后多个文件的MIME类型也会绑定到以数组

名字加ContentType和FileName的字符串数组中。   比如说上传的文件的数组名为:File[] uploads,则它们的MIME类型绑定的对应的数组是uploadsFileName和uploadsContentType.

3.struts.xml的配置

Xml代码
<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE struts PUBLIC   
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   
    "http://struts.apache.org/dtds/struts-2.0.dtd">  
  
<struts>  
    <constant name="struts.multipart.saveDir" value="/tmp" />  
    <package name="fileUploadDemo" extends="struts-default">  
        <action name ="fileUpload" class ="com.FileUploadAction">    
            <!-- 验证上传文件的类型 -->  
            <interceptor-ref name ="fileUpload">    
                <param name ="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg</param>    
            </interceptor-ref>    
            <interceptor-ref name ="defaultStack"/>    
            <!-- 如果加入了验证上传文件的类型,必须要加input -->  
            <result name ="input" >/fileUpload.jsp</result>  
            <result name ="success">/showUpload.jsp </result>    
        </action>    
    </package>  
</struts>  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
        <constant name="struts.multipart.saveDir" value="/tmp" />
    <package name="fileUploadDemo" extends="struts-default">
            <action name ="fileUpload" class ="com.FileUploadAction"> 
                    <!-- 验证上传文件的类型 -->
                   <interceptor-ref name ="fileUpload"> 
                <param name ="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg</param> 
            </interceptor-ref> 
            <interceptor-ref name ="defaultStack"/> 
            <!-- 如果加入了验证上传文件的类型,必须要加input -->
            <result name ="input" >/fileUpload.jsp</result>
            <result name ="success">/showUpload.jsp </result> 
        </action> 
    </package>
</struts> 


4.最后是web.xml的配置

Xml代码
<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.4"    
    xmlns="http://java.sun.com/xml/ns/j2ee"    
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
       
    <filter>    
        <filter-name>struts-cleanup</filter-name>    
        <filter-class>    
            org.apache.struts2.dispatcher.ActionContextCleanUp   
        </filter-class>    
    </filter>    
       
    <filter>    
        <filter-name>struts2</filter-name >    
        <filter-class>    
            org.apache.struts2.dispatcher.FilterDispatcher   
        </filter-class >    
    </filter>    
       
    <filter-mapping>    
        <filter-name>struts-cleanup</filter-name >    
        <url-pattern>/*</url-pattern>    
    </filter-mapping>    
  
    <filter-mapping>    
        <filter-name>struts2</filter-name >    
        <url-pattern>/*</url-pattern >    
    </filter-mapping>    
       
  <welcome-file-list>  
    <welcome-file>index.jsp</welcome-file>  
  </welcome-file-list>  
</web-app>  



(2) 多文件上传

多文件上传
与单文件上传相似,Struts 2实现多文件上传也很简单。你可以将多个<s:file />绑定Action的数组或列表。如下例所示。

< s:form action ="doMultipleUploadUsingList" method ="POST" enctype ="multipart/form-data" >
    < s:file label ="File (1)" name ="upload" />
    < s:file label ="File (2)" name ="upload" />
    < s:file label ="FIle (3)" name ="upload" />
    < s:submit />
</ s:form > 清单14 多文件上传JSP代码片段
如果你希望绑定到数组,Action的代码应类似:

     private File[] uploads;
     private String[] uploadSFileName;
     private String[] uploadSContentType;

多文件上传数组绑定Action代码片段
如果你想绑定到列表,则应类似:

     private List < File > uploads = new ArrayList < File > ();
     private List < String > uploadSFileName = new ArrayList < String > ();
     private List < String > uploadSContentType = new ArrayList < String > ();
多文件上传列表绑定Action代码片段
总结
在Struts 2中实现文件上传的确是轻而易举,您要做的只是使用<s:file />与Action的属性绑定。这又一次有力地证明了Struts 2的简单易用。
分享到:
评论
1 楼 漫步林中 2010-12-08  
学习了。谢谢

相关推荐

    struts2中文件上传过滤codeFilter

    以下是对Struts2中文件上传及`codeFilter`的详细解释: **1. Struts2文件上传机制** Struts2提供了内置的支持来处理文件上传,主要利用了Apache Commons FileUpload库。在Struts2的Action类中,可以定义一个字段,...

    jspstruts1_2struts2 中文件上传

    jspstruts1_2struts2 中文件上传 java文件上传

    struts2中的文件上传和下载示例

    在Struts2中处理文件上传和下载是常见的需求,对于构建交互式的Web应用来说至关重要。以下将详细介绍Struts2中如何实现这两个功能。 一、文件上传 1. 配置依赖:首先,你需要在项目中添加Apache Commons ...

    struts2实现文件上传下载

    首先,我们需要了解Struts2中的文件上传机制。Struts2提供了`FileUploadInterceptor`拦截器来处理文件上传请求。在处理文件上传时,开发者需要在Action类中声明一个`List&lt;FileInfo&gt;`类型的字段,用于接收上传的文件...

    struts2文件上传与下载

    在Struts2中,文件上传和下载是常见的功能需求,主要用于处理用户在Web表单中提交的文件,如图片、文档等。下面将详细介绍Struts2中文件上传和下载的实现方法。 ### 1. 文件上传 #### 1.1 配置Struts2 首先,我们...

    Struts2多个文件上传

    在Struts2中,文件上传功能是一个常用特性,尤其在处理用户提交的多个文件时。本文将详细讲解如何使用Struts2进行多个文件的上传,重点是使用List集合进行上传。 首先,要实现Struts2的文件上传,必须引入必要的...

    struts2 文件的上传和下载

    在Struts2中,文件上传通常涉及到以下几个步骤: 1. **创建上传表单**:在HTML或JSP页面中,使用`&lt;input type="file"&gt;`标签创建一个文件选择框,用户可以通过这个框选择要上传的文件。 2. **配置Action**:在...

    Struts2实现单个文件多个文件上传与下载-多个拦截器

    在Struts2中,文件上传主要依赖于`struts2-convention-plugin`和`struts2-file-uploading-plugin`这两个插件。要实现文件上传,你需要在Action类中定义一个字段,类型为`java.io.File`或`org.apache.struts2....

    struts2文件上传下载源代码

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

    struts2实现文件上传

    在 Struts2 中,可以通过配置来控制文件上传的行为,例如最大文件大小、是否启用文件上传等功能。这些配置可以在 `struts.xml` 文件中进行。 ```xml &lt;constant name="struts.multipart.maxSize" value="10485760"/&gt;...

    struts2的上传,下载,删除文件

    在本篇中,我们将聚焦于Struts2中的文件上传、下载和删除功能,这些是Web应用中常见的需求。 1. 文件上传: 在Struts2中,文件上传主要依赖于`Commons FileUpload`库,它处理了多部分表单数据。首先,你需要在`...

    Struts2文件的上传和下载

    在Struts2中,这个过程通过拦截器完成,特别是`fileUpload`拦截器,它负责处理文件上传的细节,并将文件绑定到Action的属性上。 以下是一个简单的Struts2文件上传示例: 1. **前端表单**: 创建一个HTML表单,...

    swfuplaod+struts2实现多文件上传

    3. **创建Struts2 Action**:在Struts2框架中,创建一个处理文件上传的Action类,该类通常会包含一个`List&lt;HttpServletFileWrapper&gt;`类型的属性,用于接收上传的文件。 4. **编写Struts2配置**:在struts.xml配置...

    struts2 实现文件批量上传

    1. **文件上传组件**:在Struts2中,我们通常使用`Commons FileUpload`库来处理文件上传。这个库提供了处理多部分HTTP请求的能力,是Java中处理文件上传的标准库。我们需要在Struts2配置文件中引入对应的拦截器`...

    struts2文件上传

    在本篇文章中,我们将深入探讨Struts2中文件上传的工作原理、实现方法以及相关注意事项。 首先,我们来看一下Struts2文件上传的基本流程: 1. 用户通过HTML表单选择本地文件,并提交到服务器。 2. Struts2拦截器...

    在Struts 2中实现文件上传

    此外,使用 `&lt;s:file&gt;` 标签将文件上传控件与 Action 中的某个字段(如 `myFile`)绑定,这样 Struts 2 就知道如何处理文件上传请求。 下面是一个简单的 `FileUpload.jsp` 示例: ```jsp ; charset=utf-8" ...

    Struts2 文件上传总结

    首先,我们需要了解Struts2中文件上传的基础知识。Struts2通过`struts2-core`库提供的`FileUpload`拦截器来处理文件上传请求。在使用Struts2进行文件上传时,我们需要在Action类中声明一个`java.io.File`类型的字段...

    struts2真正实现上传下载完整源代码

    在Struts2中,实现文件上传和下载功能是一项常见的需求。本文将深入探讨如何使用Struts2来实现这一功能,并结合提供的"struts2真正实现上传下载完整源代码"进行分析。 首先,我们要了解Struts2中文件上传的基本原理...

    Struts2实现文件上传

    在Struts2中,文件上传主要依赖于`org.apache.struts2.components.FileUpload`组件。要实现文件上传,首先需要在Action类中定义一个或多个`File`和对应的`String`类型的属性,`File`属性用于接收上传的文件,而`...

Global site tag (gtag.js) - Google Analytics