Struts2文件上传与下载

Struts2核心jar包就包含文件上传功能。
1、文件上传时,Struts2使用拦截器对表单提交的数据自动封装

      // 对应表单:<input type="file" name="file1">
      private File file1;
      // 文件名
      private String file1FileName;
      // 文件的类型(MIME)
      private String file1ContentType;

      public void setFile1(File file1) {
          this.file1 = file1;
      }
      public void setFile1FileName(String file1FileName) {
          this.file1FileName = file1FileName;
      }
      public void setFile1ContentType(String file1ContentType) {
          this.file1ContentType = file1ContentType;
      }

2、文件下载时也是用拦截器获取要下载的文件名

 // 1、获取下载的文件名
      private String fileName;
      public void setFileName(String fileName) {
        // 传入参数中文处理
        try{
            fileName = new String(fileName.getBytes("ISO-8859-1"),"utf-8");
        }catch(Exception e){
            e.printStackTrace();
        }
        this.fileName = fileName;
    }

3、文件下载时使用配置文件设置下载返回,需要action中提供一个返回文件流的方法。

<result name="download" type="stream">
                <!-- 运行下载的文件为二进制类型,在tomcat配置文件中找 -->
            <param name="contentType">application/octet-stream</param>
                <!-- 对应action中的属性,返回文件流 -->
                <param name="inputName">attrInputeStream</param>
                <!-- 下载头,包括浏览器显示的文件名 -->
    <param name="contentDisposition">attachment;filename=${downfilename}</param>
    <!-- 缓冲区大小设置 -->
    <param name="bufferSize">1024</param>
</result>
      // 3、需要一个返回文件流的方法
      private InputStream attrInputeStream;
      public InputStream getAttrInputeStream(){
          InputStream resourceAsStream = ServletActionContext.getServletContext().getResourceAsStream("/upload/"+fileName);
          return resourceAsStream;
      }

完整代码

文件处理Action

public class UploadAction extends ActionSupport{

      // 对应表单:<input type="file" name="file1">
      private File file1;
      // 文件名
      private String file1FileName;
      // 文件的类型(MIME)
      private String file1ContentType;

      public void setFile1(File file1) {
          this.file1 = file1;
      }
      public void setFile1FileName(String file1FileName) {
          this.file1FileName = file1FileName;
      }
      public void setFile1ContentType(String file1ContentType) {
          this.file1ContentType = file1ContentType;
      }

      public String upload(){

          try {
              /*****拿到上传的文件进行处理**/
              System.out.println("FileUpload.execute()");
              // 获取上传的目录路径
              String path = ServletActionContext.getServletContext().getRealPath("/upload");
              // 创建目标文件对象
              File destFile = new File(path,file1FileName);
              // 把上传的文件拷贝到目标文件中
              FileUtils.copyFile(file1, destFile);
              return "upload";
          } catch (Exception e) {
              e.printStackTrace();
              return "error";
          }
     }

      public String list(){
          String path = ServletActionContext.getServletContext().getRealPath("/upload");
          File file = new File(path);
          String[] filelist = file.list();
          ServletActionContext.getRequest().setAttribute("filelist", filelist);
          return "list";
      }


      /***************文件下载**********************/
      // 1、获取下载的文件名
      private String fileName;
      public void setFileName(String fileName) {
        // 传入参数中文处理
        try{
            fileName = new String(fileName.getBytes("ISO-8859-1"),"utf-8");
        }catch(Exception e){
            e.printStackTrace();
        }
        this.fileName = fileName;
    }

      // 2、下载提交
      public String down(){

          return "download";
      }
      // 3、需要一个返回文件流的方法
      private InputStream attrInputeStream;
      public InputStream getAttrInputeStream(){
          InputStream resourceAsStream = ServletActionContext.getServletContext().getResourceAsStream("/upload/"+fileName);
          return resourceAsStream;
      }
      // 4、下载显示的文件名
      public String getDownfilename() throws UnsupportedEncodingException{
          // 编码
          fileName = URLEncoder.encode(fileName, "utf-8");
          return fileName;
      }
}

action配置文件struts.xml

        <!-- 文件上传action(注意关键字不能用fileUpload) -->
        <action name="file_*" class="com.wsk.d_upload.UploadAction" method="{1}">
            <result name="upload" type="redirectAction">file_list</result>
            <result name="list">/list.jsp</result>

            <result name="download" type="stream">
                <!-- 运行下载的文件为二进制类型,在tomcat配置文件中找 -->
                <param name="contentType">application/octet-stream</param>
                <!-- 对应action中的属性,返回文件流 -->
                <param name="inputName">attrInputeStream</param>
                <!-- 下载头,包括浏览器显示的文件名 -->
                <param name="contentDisposition">attachment;filename=${downfilename}</param>
                <!-- 缓冲区大小设置 -->
                <param name="bufferSize">1024</param>
            </result>
        </action>

列表展示list.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'list.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>

  <body>
    <table border="1" align="center">
        <tr>
            <th>序号</th>
            <th>文件名</th>
            <th>操作</th>
        </tr>
        <c:forEach var="e" items="${requestScope.filelist }" varStatus="vs">
            <tr>
                <td>${vs.count }</td>
                <td>${e }</td>
                <td><a href="${pageContext.request.contextPath }/file_down?fileName=${e}">下载</a></td>
            </tr>
        </c:forEach>
        <tr><td colspan="3" align="center"><a href="${pageContext.request.contextPath }/upload.jsp">上传</a></td></tr>
    </table>
  </body>
</html>

文件上传提交页面

    <form action="${pageContext.request.contextPath }/file_upload" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="userName"><br/>
        文件:<input type="file" name="file1"><br/>
        <input type="submit" value="上传">
    </form>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值