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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM