Struts2多个文件上传
10级学员 韩晓爽课堂笔记

多个文件上传分为List集合和数组,下面我们着重介绍一下list集合的上传。都大同小异。

一  介绍

1.  在struts2文件上传的时候要先导入struts2的几个包,在struts2.3.1.2中,导入的包如图所视:

从图上可以看出其中文件上传所需要的是包为commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar包。

2. Struts2文件上传并未提供自己的请求解析器,也就是说,struts2不会自己去处理multipart/form-data的请求,它需要调用其他的请求解析器,将http请求中的表单域解析出来。但struts2在原有的上传解析器继承上做了进一步封装,更进一步简化了文件上传。

3.  Struts2默认使用的是Jakarta和Connon-FileUpload的文件上传框架,因此,如果需要使用struts2的文件上传功能,则需要在Web应用导入上面我所说的几个包

4.  Struts2的文件上传支持在原有的问上传项目上做了进一步封装,简化了文件上传代码实现,取消了不同上传项目上编程差异。

二  实例

1. 首先我们来了解一下表单属性enctype属性的意义

表单的enctype属性指定的是表单数据的编码方式,该属性呢有3个值

(1)       application/x-www-form-urlencoded,这是默认的编码方式,它只能处理表单域里的value属性,采用这种编码方式的表单会将表单域的值处理成URL编码方式。

(2)       multipart/form-data,采用这种编码方式会以二进制流的方式来处理表单数据 ,这种编码方式会把文件域指定文件的内容也封装到请求参数里。

(3)       text/plain,这种编码方式当表单的action属性为mailto:URL的形式是比较方便,这种方式主要适用于直接通过表单发送邮件的方式。

从以上的介绍可以看出为什么文件上传要用到的是multipart/form-data属性了吧!上传的文件会在底层封装,并通过二进制流读取。

2. 下面我们来写这样一个界面来实现多文件的上传:效果如下图:

所用的html代码为:

[html] view plaincopy
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  

<%@ taglib uri="/struts-tags" prefix="s"%>  

<%
    String path = request.getContextPath();  

    String basePath = request.getScheme() + "://"  

           + request.getServerName() + ":" + request.getServerPort()  

           + path + "/";
%>  

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

<html>  

    <head>  

       <base href="<%=basePath%>">  

       <title>My JSP 'tagUpload.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>
      <h3>多个文件上传实例</h3>
       <s:form action="/csdn/uploadList.action" enctype="multipart/form-data" method="post">
           <s:textfield label="上传名称" name="name"></s:textfield>
           <s:file label="上传文件" name="upload"></s:file>
           <s:file label="上传文件" name="upload"></s:file>
           <s:file label="上传文件" name="upload"></s:file>
           <s:submit value="上传" />
       </s:form>
    </body>
</html>   

在这里要注意的是要引入标签:

[html] view plaincopy
<%@ taglib uri="/struts-tags" prefix="s"%>
       上面的页面只是一个普通的html页面,没有任何的动态部分,当该页面提交请求的时候发送到/csdn/uploadList.action,这是一个struts2的action。

    Struts2的Action无需负责处理HttpServletRequest请求,因为struts2的Action已经与servletAPI彻底分离了,struts2框架负责解析httpServletRequest请求的参数,包括文件域,strtus2使用File类型来封装文件域。

3.下面是处理Action的代码:

[java] view plaincopy
package cn.csdn.hr.up.action;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class TagUploadListAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private String name;  

    // 上传多个文件的集合文本  

    private List<File> upload;
    // /多个上传文件的类型集合
    private List<String> uploadContextType;
   // 多个上传文件的文件名集合
    private List<String> uploadFileName;  

       public String execute() {  

       // 把上传的文件放到指定的路径下  

       String path = ServletActionContext.getServletContext().getRealPath(  

              "/WEB-INF/uploadList");  

       // 写到指定的路径中  

       File file = new File(path);  

       // 如果指定的路径没有就创建  

       if (!file.exists()) {  

           file.mkdirs();
       }  

       // 把得到的文件的集合通过循环的方式读取并放在指定的路径下  

       for (int i = 0; i < upload.size(); i++) {
           try {  

              //list集合通过get(i)的方式来获取索引  

              FileUtils.copyFile(upload.get(i), new File(file, uploadFileName.get(i)));  

           } catch (IOException e) {  

              // TODO Auto-generated catch block  

              e.printStackTrace();
           }
       }  

       return SUCCESS;
    }
}
通过以上的Action我们可以看出Action还包括了两个属性,uploadFileName,uploadContextType, 这两个属性分别用来封装上传我文件的文件名,上传文件的文件类型,这两个属性体现了struts设计的灵巧、简化之处,Action类直接通过File类型属性直接封装了上传文件的内容,但这个File属性无法获取上传文件的文件名和文件类型,所以struts2直接将包含的上传文件名和文件类型的信息封装到uploadFileName,uploadContextType属性中,可以认为:如果表单中包含一个name属性为xxx的文件域,则对应的Action需要使用3个属性来封装该文件域的信息:

(1)   类型为File的xxx属性封装了该文件域对应的文件内容

(2)   类型为String的xxxFileName属性封装了该案文件域对应的文件的文件类型

(3)   类型为String的xxxContextType属性封装了该文件域对应的文件的类型

通过上吗的三个属性可以简单的实现上传文件的文件名、文件类型和文件内容

3. 配置action的strtus.xml

[html] view plaincopy
<?xml version="1.0" encoding="GBK"?>  

<!DOCTYPE struts PUBLIC  

    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  

    "http://struts.apache.org/dtds/struts-2.3.dtd">  

<struts>
    <package name="file" extends="struts-default" namespace="/csdn">  

       <action name="uploadList" class="cn.csdn.hr.up.action.TagUploadListAction">  

           <result>../success.jsp</result>  

           <result name="input">../tagUpload.jsp</result>  

       </action>
    </package>
</struts>
4. 设置上传的文件的大小和类型

就是在struts.xml中用拦截器来设置   

[html] view plaincopy
<action name="uploadList" class="cn.csdn.hr.up.action.TagUploadListAction">  

           <result>../success.jsp</result>  

           <result name="input">../tagUpload.jsp</result>  

           <!-- 通过拦截器来限制上传图片的类型和大小 -->  

           <interceptor-ref name="fileUpload">  

              <param name="allowedTypes">image/bmp,image/x-png,image/gif</param>  

              <param name="maximumSize">200</param>  

           </interceptor-ref>  

           <interceptor-ref name="defaultStack"></interceptor-ref>  

       </action>  

显示的错误提示信息的标签为:

             <s:fielderror></s:fielderror>

以上的多个文件上传是List集合的,数组的也不过如此,要改变的地方为Action接收的时候类型的不同和读取的时候循环不同,下面的数组的例子为:

[java] view plaincopy
        // 得到上传文件的名称一定与name值一直
private File upload[];
// 上传文件的类型 ContentType
private String uploadContentType[];
// 上传文件的名称
private String uploadFileName[];
public File[] getUpload() {
    return upload;
}  

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

public String[] getUploadContentType() {
    return uploadContentType;
}  

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

public String[] getUploadFileName() {
    return uploadFileName;
}  

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

public static long getSerialversionuid() {
    return serialVersionUID;
}  

public String uploads() {
    String path = ServletActionContext.getServletContext().getRealPath(
            "/upload");  

    // 写到指定路径
    File file = new File(path);
    //判断指定的路径下是否有uplaod,如果没有,自动创建
    if (!file.exists()) {
        file.mkdirs();
    }
    try {
        for(int i = 0;i<upload.length;i++){
            FileUtils.copyFile(upload[i], new File(file, uploadFileName[i]));
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return SUCCESS;
}  

Struts多个文件上传的更多相关文章

  1. Struts学习之文件上传

    * 单文件上传:        * 在动作类action中声明相关属性:            * 在动作类action中,要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型:  ...

  2. Struts 框架 之 文件上传下载案例

    Struts 框架 文件上传 1. 先准备 Struts 环境 (我使用的是struts 2.3.4版本) 导jar包:

  3. Struts 2 之文件上传

    如果要获得上传文件的原始名称,需要定义一个String类型的属性,属性名必须为***FileName,其中***为File属性的名称:同理,如果要获取该文件的MIME类型,需要定义一个***Conte ...

  4. Struts 1 之文件上传

    Struts 1 对Apache的commons-fileupload进行了再封装,把上传文件封装成FormFile对象 定义UploadForm: private FormFilefile; //上 ...

  5. Java Struts文件上传和下载详解

    Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...

  6. 转:在Struts 2中实现文件上传

    (本文转自:http://www.blogjava.net/max/archive/2007/03/21/105124.html) 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题 ...

  7. java框架篇---struts之文件上传和下载

    Struts2文件上传 Struts 2框架提供了内置支持处理文件上传使用基于HTML表单的文件上传.上传一个文件时,它通常会被存储在一个临时目录中,他们应该由Action类进行处理或移动到一个永久的 ...

  8. Struts 2(八):文件上传

    第一节 基于Struts 2完成文件上传 Struts 2框架中没有提供文件上传,而是通过Common-FileUpload框架或COS框架来实现的,Struts 2在原有上传框架的基础上进行了进一步 ...

  9. 使用commons-fileupload包进行大文件上传注意事项

    项目中使用 commons-fileupload-1.2.1.jar 进行大文件上传. 测试了一把,效果很不错. 总结如下: 必须设置好上传文件的最大阀值 final long MAX_SIZE = ...

随机推荐

  1. LeetCode OJ--Gray Code **

    http://oj.leetcode.com/problems/gray-code/ 求格雷码的表示,主要应用递归. 递归生成码表 这种方法基于格雷码是反射码的事实,利用递归的如下规则来构造: 1位格 ...

  2. 【APIO2015】Bali Sculptures

    题目描述 印尼巴厘岛的公路上有许多的雕塑,我们来关注它的一条主干道. 在这条主干道上一共有 $N$ 座雕塑,为方便起见,我们把这些雕塑从 $1$ 到 $N$ 连续地进行标号,其中第 $i$ 座雕塑的年 ...

  3. fastscript增加三方控件之二

    fastscript增加三方控件之二 unit fs_BsDataSet; interface {$i fs.inc} uses SysUtils, Classes, fs_iinterpreter, ...

  4. GDI+ ColorMatrix的完全揭秘

    无论是用何种语言,只要使用过Windows的GDI+的人对ColorMatrix都不陌生,我的BLOG文章中也多次提到过,并在<GDI+ for VCL基础 -- 颜色调整矩阵ColorMatr ...

  5. C#制作、打包、签名、发布Activex全过程【转】

    http://www.cnblogs.com/still-windows7/p/3148623.html 一.前言 最近有这样一个需求,需要在网页上面启动客户端的软件,软件之间的通信.调用,单单依靠H ...

  6. 百科知识 kux文件如何打开

    即使是官方自带的浏览器也无法打开   你可以直接复制文件名   然后在百度里搜即可   你自己下载的东西还是能转码的      

  7. Food hub

    Work center List Tillage 耕作 Hand harvest 手工采收 Planting 种植 Cultivating 培养 Mulching 覆盖 Dig harvest 挖地采 ...

  8. Construct Binary Tree from Inorder and Postorder Traversal ——通过中序、后序遍历得到二叉树

    题意:根据二叉树的中序遍历和后序遍历恢复二叉树. 解题思路:看到树首先想到要用递归来解题.以这道题为例:如果一颗二叉树为{1,2,3,4,5,6,7},则中序遍历为{4,2,5,1,6,3,7},后序 ...

  9. Android加壳native实现

    本例仅在Android2.3模拟器跑通过,假设要适配其它机型.请自行研究,这里不过抛砖引玉. 0x00 在Android中的Apk的加固(加壳)原理解析和实现,一文中脱壳代码都写在了java层非常ea ...

  10. AVOS Cloud 技术支持系统开源了

    非常高兴跟大家说.工单系统(技术支持系统)开源了.代码托管在了Github上. 假设还未见识过工单系统,请移步于 https://ticket.avosapps.com/ 这个系统是用 AVOS Cl ...