struts2学习笔记--上传单个和批量文件示例

小编 2026-07-13 阅读:1479 评论:0
    struts2提供了对上传文件的支持,将上传后的文件封装为java.io.File对象,...

    struts2提供了对上传文件的支持,将上传后的文件封装为java.io.File对象,开发者只需要在Action中定义一个File类型的变量,然后直接使用该变量,将它复制到目的目录即可.

  • 单个文件上传实例

  `  下面是一个单个文件上传的小例子,webRoot下新建一个upLoad.jsp,核心代码为:

<body>      <!-- 必须将method指定为post,同时将enctype属性设置成如下形式,      第一个input中的name属性,值必须与Action中定义的Fil类型的变量名相同 -->         <form action="upLoad.action" method="post" enctype="multipart/form-data">        文件:<input type="file" name="picture"/><br>        <input type="submit" value="上传"/>    </form>  </body>

  action包下新建一个名为UpLoadAction的java类:

struts2学习笔记--上传单个和批量文件示例struts2学习笔记--上传单个和批量文件示例
 1 package com.wang.action; 2  3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.InputStream; 9 import java.io.OutputStream;10 11 import javax.servlet.http.HttpServletRequest;12 13 import org.apache.struts2.ServletActionContext;14 15 import com.opensymphony.xwork2.ActionSupport;16 17 public class UpLoadAction extends ActionSupport{18 19     //上传的文件,struts2会把文件封装为File对象20     private File picture;21     //文件名,struts2会把文件名称设置到该变量22     private String pictureFileName;23     //文件类型,struts2会把文件类型设置到该变量24     private String pictureContentType;25     26     public String upLoad() throws IOException{27         //获取request,进而获取文件的路径28         HttpServletRequest request=ServletActionContext.getRequest();29         String path=request.getRealPath("/aaa");30         //最终将文件保存到/upload下31         File saved=new File(path,pictureFileName);32         InputStream is=new FileInputStream(picture);33         OutputStream os=new FileOutputStream(saved);34         byte[] b=new byte[1024];35         int len=0;36         while((len=is.read(b))!=-1){37             os.write(b, 0, len);38         }39         40         is.close();41         os.close();42         System.out.println("upLoad");43         return SUCCESS;44         45     }46     47     public File getPicture() {48         return picture;49     }50     public void setPicture(File picture) {51         this.picture = picture;52     }53     public String getPictureFileName() {54         return pictureFileName;55     }56     public void setPictureFileName(String pictureFileName) {57         this.pictureFileName = pictureFileName;58     }59     public String getPictureContentType() {60         return pictureContentType;61     }62     public void setPictureContentType(String pictureContentType) {63         this.pictureContentType = pictureContentType;64     }65     66 }
UpLoadAction代码

  特别注意上面代码第29行,要在webRoot路径下新建一个名为aaa的文件夹,,用于存放上传的文件.  

  UpLoadAction中定义了一个名为picture的File类型的对象,用于接收表单传来的图片文件,Struts2会把图片文件保存到临时文件夹里,然后把路径设置到picture属性上,需要注意的是,临时文件的名称不会是上传文件的原名称,目的是为了保证临时文件夹中文件名不会重复,Struts2根据时间戳随机生成了不重复的文件名,后缀是.tmp.但我们一般希望获取该文件的原始名称,这时,我们还需要定义一个String类型的名为xxxFileName的属性,其中xxx在这个例子里是picture,即为File类型的变量名,同时要想获得原始文件的文件类型,还需要定义一个String类型的名为xxxContentType的变量,xxx也是File类型的变量名.

  Struts2中文件上传的最大值为2m,但我们希望可以自定义最大上传Size,下面是修改了MaxSize(将最大上传大小设置为20m)的Struts.xml:

<struts>    <!-- 设置临时目录 -->    <constant name="struts.multipart.saveDir" value="F:"/>    <!--设置上传文件的最大存储,其value必须大于 下面的maximumSize,因为检查文件大小时,会先检查Struts2全局的MaxSize属性,后检查maximumSize属性 -->    <constant name="struts.multipart.maxSize" value="20971520"></constant>        <package name="default" namespace="/" extends="struts-default">        <interceptors>            <interceptor-stack name="myStack">                <interceptor-ref name="fileUpload">                    <param name="allowedTypes"></param>                    <param name="maximumSize">20971520</param>                </interceptor-ref>                <interceptor-ref name="defaultStack"></interceptor-ref>            </interceptor-stack>        </interceptors>        <action name="upLoad" class="com.wang.action.UpLoadAction" method="upLoad">            <result>/index.jsp</result>            <interceptor-ref name="myStack"></interceptor-ref>                    </action>    </package></struts>
  • 批量文件上传

  与上传单个文件类似,只需要将UpLoadAction里File,xxxFileName,xxxContentType设置为数组类型,然后用for循环遍历读取每个文件,即可,这里主要介绍一下上传多个文件的简单的前端页面怎么写(用到jquery):我们希望的效果是这样(点击添加可以添加一个file选项,点击删除可以删除当前file选项):

            struts2学习笔记--上传单个和批量文件示例

  upLoad.jsp代码如下:

struts2学习笔记--上传单个和批量文件示例struts2学习笔记--上传单个和批量文件示例
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6  7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9   <head>10     <base href="<%=basePath%>">11     12     <title>My JSP 'upLoad.jsp' starting page</title>13     14     <meta http-equiv="pragma" content="no-cache">15     <meta http-equiv="cache-control" content="no-cache">16     <meta http-equiv="expires" content="0">    17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">18     <meta http-equiv="description" content="This is my page">19     <!--20     <link rel="stylesheet" type="text/css" href="styles.css">21     -->22 <script type="text/javascript" src="jquery/jquery.min.js"></script>23 <script type="text/javascript">24     $(function(){25         $('#btn').click(function(){26             var field="<p>文件:<input type='file' name='picture'/><input id='btn' type='button' value='删除' onclick='deleteCurrent(this);'/><br></p>"27             $("#files").append(field);28         });29         30     });31     function deleteCurrent(a){32         $(a).parent().remove();33     }34 </script>35   </head>36   37   <body>38       <!-- 必须将method指定为post,同时将enctype属性设置成如下形式,39       第一个input中的name属性,值必须与Action中定义的Fil类型的变量名相同 -->40          <form action="upLoad.action" method="post" enctype="multipart/form-data">41         文件:<input type="file" name="picture"/><input id="btn" type="button" value="添加"/><br>42         <div id="files"></div>43         <input type="submit" value="上传"/>44     </form>45   </body>46 </html>
upLoad.jsp

  upLoadAction代码如下:

struts2学习笔记--上传单个和批量文件示例struts2学习笔记--上传单个和批量文件示例
package com.wang.action;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class UpLoadAction extends ActionSupport{    //上传的文件,struts2会把文件封装为File对象    private File[] picture;    //文件名,struts2会把文件名称设置到该变量    private String[] pictureFileName;    //文件类型,struts2会把文件类型设置到该变量    private String[] pictureContentType;        public String upLoad() throws IOException{        //获取request,进而获取文件的路径        HttpServletRequest request=ServletActionContext.getRequest();        String path=request.getRealPath("/aaa");        //最终将文件保存到/upload下        for(int i=0;i<picture.length;i++){            File saved=new File(path,pictureFileName[i]);            InputStream is=new FileInputStream(picture[i]);            OutputStream os=new FileOutputStream(saved);            byte[] b=new byte[1024];            int len=0;            while((len=is.read(b))!=-1){                os.write(b, 0, len);            }                    is.close();            os.close();        }        System.out.println("upLoad success");        return SUCCESS;            }    public File[] getPicture() {        return picture;    }    public void setPicture(File[] picture) {        this.picture = picture;    }    public String[] getPictureFileName() {        return pictureFileName;    }    public void setPictureFileName(String[] pictureFileName) {        this.pictureFileName = pictureFileName;    }    public String[] getPictureContentType() {        return pictureContentType;    }    public void setPictureContentType(String[] pictureContentType) {        this.pictureContentType = pictureContentType;    }            }
UpLoadAction

  struts.xml不需要修改.

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
标签列表