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. hdu 1588(矩阵好题+递归求解等比数列)

    Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. 微信公众号手机端PC端多客服系统

    最近很多客户反应没有专门的客服坐在电脑面前,接收回复客户的问题:不能及时回复客户 咨询的问题,现在我们已经为此帮您解决烦恼!! 支持PC与手机端接收微信客户咨询与回复客户,让您随时随地及时回复客户咨询 ...

  3. Codeforces 946 B.Weird Subtraction Process

    B. Weird Subtraction Process   time limit per test 1 second memory limit per test 256 megabytes inpu ...

  4. 洛谷——P1187 3D模型

    P1187 3D模型 题目描述 一座城市建立在规则的n×m网格上,并且网格均由1×1正方形构成.在每个网格上都可以有一个建筑,建筑由若干个1×1×1的立方体搭建而成(也就是所有建筑的底部都在同一平面上 ...

  5. [Bzoj5358][Lydsy1805月赛]口算训练(预处理+动态开点线段树)

    5358: [Lydsy1805月赛]口算训练 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 318  Solved: 105[Submit][Stat ...

  6. 为VLC增加在线字幕插件VLSub

    VLC的在在线字幕插件VLSub,官网:https://github.com/exebetche/vlsub. 原理是通过搜索全球最大的字幕网站https://www.opensubtitles.or ...

  7. CSS3模拟IOS滑动开关

    前言 H5站点需要IOS滑动按钮的效果,想了想似乎CSS3能搞起,就折腾出来了...挺简单的..请看注释 效果 代码 <!DOCTYPE html> <html lang=" ...

  8. Utuntu 和 window共享文件

    由于自己想用服务器跑代码,数据集和模型一般都在本机电脑上,用实验室服务器需要拷贝数据或者,在服务器上重新下载数据很麻烦 都在局域网内可以实现文件共享,代码和数据都在本地,共享给服务器,只需要使用服务器 ...

  9. Nutch学习笔记二——抓取过程简析

    在上篇学习笔记中http://www.cnblogs.com/huligong1234/p/3464371.html 主要记录Nutch安装及简单运行的过程. 笔记中 通过配置抓取地址http://b ...

  10. sql的一些知识_计算字段

    创建计算字段 拼接字段 mysql中 使用concat拼接字段 得到的info可以被客户端使用 算术计算 对检索的数据进行运算并as为新的列名 ) ORDER BY weight