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

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

  • 相关阅读:
    突破极验验证的验证码
    c# 自定义多选下拉列表2
    c#多选下拉框(ComboBox)
    图片缩放+拖动(html)
    使用天天模拟器开发android应用
    FineUI开源版之TreeGrid(修改)
    FineUI开源版之TreeGrid实现
    c# 窗体最小化后截图实现
    c#一个简单的实例告诉你,多继承还可以这么来
    设置控件Enable=false,控件颜色不变
  • 原文地址:https://www.cnblogs.com/fnz0/p/5979367.html
Copyright © 2020-2023  润新知