struts 文件上傳下載

上傳java

一、編寫上傳action類 UploadAction.javaapache

 1 package jxf.b_upload;
 2 
 3 import java.io.File;
 4 import java.io.IOException;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 
 8 import org.apache.commons.io.FileUtils;
 9 import org.apache.struts2.ServletActionContext;
10 
11 public class UploadAction {
12     public File file01;//上傳的文件  --對應表單中的<input type="file" name="file01"> name的值
13     public String file01FileName;//上傳文件的文件名    --表單中name的值+FileName
14     public String file01ContentType;// 上傳文件的文件的類型(MIME) --表單中name的值+ContentType
15     
16     public void setFile01(File file01) {
17         this.file01 = file01;
18     }
19 
20     public void setFile01FileName(String file01FileName) {
21         this.file01FileName = file01FileName;
22     }
23 
24     public void setFileContentType(String file01ContentType) {
25         this.file01ContentType = file01ContentType;
26     }
27 
28     /**
29      * 上傳
30      * @return
31      */
32     public String upload() {
33         //處理文件   把文件上傳到upload目錄
34         try {
35             //建立目標文件  
36             File destFile = new File(ServletActionContext.getServletContext().getRealPath("/upload"),file01FileName);
37             //拷貝上傳的文件到目標文件
38             FileUtils.copyFile(file01, destFile);
39             System.out.println("上傳完成");
40         } catch (IOException e) {
41             e.printStackTrace();
42             throw new RuntimeException(e);
43         }
44         return "success";
45     }
46 }

二、配置文件數組

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- struts默認的上傳文件大小限制是2M,可經過常量的配置來改變 -->
    <constant name="struts.multipart.maxSize" value="10485760"></constant>
    <package name="upload_" extends="struts-default">
        <action name="uploadTest" class="jxf.b_upload.UploadAction" method="upload">
            <!-- 限制運行上傳的文件的類型 -->
            <interceptor-ref name="defaultStack">
                <!-- 限制運行的文件的擴展名
                <param name="fileUpload.allowedExtensions">txt,jpg,jar</param>
                 -->
                <!-- 限制運行的類型   【與上面同時使用,取交集】
                <param name="fileUpload.allowedTypes">text/plain</param>
                -->
            </interceptor-ref>
            <!-- 錯誤視圖 -->
            <result name="input">/error.jsp</result>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

三、前臺jsp頁面瀏覽器

  <body>
    <form action="${pageContext.request.contextPath}/uploadTest" method="post" enctype="multipart/form-data">
        <input type="file" name="file01">
        <input type="submit" value="上傳">
    </form>
  </body>

若是是多文件上傳,能夠使用同名的<input type="file" name="">標籤,並在action處理類中用數組接收(固然也能夠用不一樣的name值,並用對應的字段接收),而後遍歷處理app

 1 public class UploadAction {
 2     public File[] file01;//上傳的文件  --對應表單中的<input type="file" name="file01"> name的值
 3     public String[] file01FileName;//上傳文件的文件名    --表單中name的值+FileName
 4     public String[] file01ContentType;// 上傳文件的文件的類型(MIME) --表單中name的值+ContentType
 5     
 6     public void setFile01(File[] file01) {
 7         this.file01 = file01;
 8     }
 9 
10     public void setFile01FileName(String[] file01FileName) {
11         this.file01FileName = file01FileName;
12     }
13 
14     public void setFileContentType(String[] file01ContentType) {
15         this.file01ContentType = file01ContentType;
16     }
17
18     /**
19      * 上傳
20      * @return
21      */
22     public String upload() {
23         //處理文件   把文件上傳到upload目錄
24         try {
25             //建立目標文件  
26             for (int i = 0; i < file01.length; i++) {
27                 File destFile = new File(ServletActionContext.getServletContext().getRealPath("/upload"),file01FileName[i]);
28                 //拷貝上傳的文件到目標文件
29                 FileUtils.copyFile(file01[i], destFile);
30                 System.out.println("上傳完成");
31             }
32             
33         } catch (IOException e) {
34             e.printStackTrace();
35             throw new RuntimeException(e);
36         }
37         return "success";
38     }
39 }
<form action="${pageContext.request.contextPath}/uploadTest" method="post" enctype="multipart/form-data">
        <input type="file" name="file01">
        <input type="file" name="file01">
        <input type="file" name="file01">
        <input type="submit" value="上傳">
    </form>

下載:jsp

一、編寫下載acton類 DownAction.javapost

 1 package jxf.b_upload;
 2 
 3 import java.io.File;
 4 import java.io.InputStream;
 5 import java.io.UnsupportedEncodingException;
 6 import java.net.URLEncoder;
 7 import java.util.Map;
 8 
 9 import org.apache.struts2.ServletActionContext;
10 
11 import com.opensymphony.xwork2.ActionContext;
12 
13 public class DownAction {
14 
15     /**
16      * 1. 顯示全部要下載文件的列表
17      * @return
18      */
19     public String list(){
20         //獲取全部要下載的文件
21         File file = new File(ServletActionContext.getServletContext().getRealPath("/upload"));
22         String[] fileNames = file.list();//全部文件名
23         ActionContext ac =  ActionContext.getContext();
24         Map<String,Object> request = ac.getContextMap();
25         request.put("fileNames", fileNames);//將文件名放入request
26         return "list";
27     }
28     
29     /*************2. 文件下載*********************/
30     // 1. 獲取要下載的文件的文件名
31     private String fileName;//對應提交的參數名
32     public void setFileName(String fileName) {
33         // 處理傳入的參數中問題(get提交)
34         try {
35             fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
36         } catch (UnsupportedEncodingException e) {
37             throw new RuntimeException(e);
38         }
39         // 把處理好的文件名,賦值
40         this.fileName = fileName;
41     }
42     
43     //2. 下載提交的業務方法 (在struts.xml中配置返回stream)
44     public String down() throws Exception {
45         return "success";
46     }
47     
48     // 3. 返回文件流的方法
49     public InputStream getAttrInputStream(){
50         return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName);
51     }
52     
53     // 4. 下載顯示的文件名(瀏覽器顯示的文件名)
54     public String getDownFileName() {
55         // 須要進行中文編碼
56         try {
57             fileName = URLEncoder.encode(fileName, "UTF-8");
58         } catch (UnsupportedEncodingException e) {
59             throw new RuntimeException(e);
60         }
61         return fileName;
62     }
63     
64 }

二、配置文件this

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="down_" extends="struts-default">
        <action name="downlist" class="jxf.b_upload.DownAction" method="list">
            <result name="list">/down.jsp</result>
        </action>
        <action name="down_down" class="jxf.b_upload.DownAction" method="down">
            <result name="success" type="stream">
               <!-- 運行下載的文件的類型:指定爲全部的二進制文件類型 -->
               <param name="contentType">application/octet-stream</param>
               <!-- 對應的是Action中屬性: 返回流的屬性【其實就是getAttrInputStream()】 -->
               <param name="inputName">attrInputStream</param>
               <!-- 下載頭,包括:瀏覽器顯示的文件名  ${downFileName},${}爲struts中的取值符,downFileName對應getDownFileName()-->
               <param name="contentDisposition">attachment;filename=${downFileName}</param>
               <!-- 緩衝區大小設置 -->
               <param name="bufferSize">1024</param>
            </result>
        </action>
    </package>
</struts>

三、下載列表jsp編碼

  <body>
    <table border="1" align="center">
        <tr>
            <td>序號</td>
            <td>文件名</td>
            <td>操做</td>
        </tr>
        <c:forEach var="item" items="${fileNames}" varStatus="sta">
            <tr>
                <td>${sta.count}</td>
                <td>${item}</td>
                <td>
                    <c:url var="url" value="down_down">
                        <c:param name="fileName" value="${item}"></c:param>
                    </c:url>
                    <a href="${url}">下載</a>
                </td>
            </tr>
        </c:forEach>
    </table>
  </body>

 

下載編寫方式比較特殊,並不容易記憶,此處記錄方便之後用到查閱。url

相關文章
相關標籤/搜索