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

简介:     struts2提供了对上传文件的支持,将上传后的文件封装为java.io.File对象,开发者只需要在Action中定义一个File类型的变量,然后直接使用该变量,将它复制到目的目录即可. 单个文件上传实例   `  下面是一个单个文件上传的小例子,webRoot下新建一个upLoad.

    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类:

 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选项):

            

  upLoad.jsp代码如下:

 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代码如下:

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不需要修改.

 

相关文章
|
1月前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
125 8
|
3月前
|
XML JavaScript 数据格式
xercesc库中文保存XML功能实现
本文介绍了如何使用xercesc库实现中文内容的XML文件保存,包括初始化平台、创建文档、添加节点和序列化输出的完整代码示例。
xercesc库中文保存XML功能实现
|
6月前
|
Java
springboot文件上传分类保存并回显
springboot文件上传分类保存并回显
|
7月前
|
前端开发
【专栏】在前端开发中,package.json 文件是项目的重要配置文件,其中包含了许多与项目相关的信息和设置
【4月更文挑战第29天】`package.json`的`proxy`字段用于配置开发环境中的代理服务器,解决跨域问题并模拟后端响应。它是字符串类型,值为代理服务器地址。主要应用场景包括前端跨域请求和本地调试。配置时在`package.json`顶层添加`proxy`字段,如`"proxy": "http://localhost:8080"`。该配置仅在开发环境中生效,生产环境需另寻解决方案。
108 1
|
人工智能 自然语言处理 小程序
微信小程序打开项目提示读取project.config.json文件失败
微信小程序打开项目提示读取project.config.json文件失败
141 0
|
存储 Java
Java实现文件上传到本地(自定义保存路径)
Java实现文件上传到本地(自定义保存路径)
822 0
|
安全 前端开发
fastadmin自定义excel文件导入,实现文件上传功能 --已实现
fastadmin自定义excel文件导入,实现文件上传功能 --已实现
1284 0
|
JSON Shell 测试技术
gookit/config - Go应用配置管理,支持多种格式,多文件加载,支持数据合并,解析环境变量名等等
gookit/config - Go应用配置管理,支持多种格式,多文件加载,支持数据合并,解析环境变量名,绑定数据到结构体等等
204 0
gookit/config - Go应用配置管理,支持多种格式,多文件加载,支持数据合并,解析环境变量名等等
|
XML 前端开发 Java
SpringMVC--常用的三种文件实现上传实现方式你知道么?
文件的上传与下载基本上是web项目中会用到的技术,在web学习中我们用到的是 Apache fileupload这个组件来实现上传,在springmvc中对它进行了封装,让我们使用起来比较方便,但是底层还是由Apache fileupload来实现的。springmvc中由MultipartFile接口来实现文件上传。
353 0
|
XML SQL JSON
python自动提交到百度,解析sitemap.xml自动提交,网站干货,赶紧收藏
python自动提交到百度,解析sitemap.xml自动提交,网站干货,赶紧收藏,小站http://meishih.com已经尝试过了
129 0
python自动提交到百度,解析sitemap.xml自动提交,网站干货,赶紧收藏