zoukankan      html  css  js  c++  java
  • struts2学习笔记--上传单个和批量文件示例

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

  • 相关阅读:
    heapq of python
    array of python
    Unittest of Python
    事件驱动型工作流 vs 引擎型工作流
    airflow
    WPF 调试触发器
    WPF 使用Popup和TreeView实现树状下拉框
    Oracle : ORA 00933: SQL command not properly ended
    PostgreSQL && PostGIS
    基于ArcGIS开发3D立方体空间关系判断
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5191440.html
Copyright © 2011-2022 走看看