struts 文件上传下载

上传

1、编写上传action类 UploadAction.java

 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 }

2、配置文件

<?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>

3、前台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值,并用对应的字段接收),然后遍历处理

 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>

下载:

1、编写下载acton类 DownAction.java

 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 }

2、配置文件

<?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>

3、下载列表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>

 

下载编写方式比较特殊,并不容易记忆,此处记录方便以后用到查阅。

 

posted @ 2016-10-20 22:45  酒香逢  阅读(236)  评论(0编辑  收藏  举报