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

  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/fingerboy/p/5191440.html
Copyright © 2020-2023  润新知