zoukankan      html  css  js  c++  java
  • struts2实现文件的上传和下载实例[转]

    实现原理

    Struts 2是通过Commons FileUpload文件上传。

    Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件

    具体实现:

    一、创建index.jsp页面

    复制代码
     1 <body>
     2  <s:form action="upload" method="post" theme="simple" enctype="multipart/form-data">
     3 <table align="center" width="50%" border="1">
     4 <tr>
     5         <td>选择上传文件</td>
     6         <td id="more">
     7             <s:file name="file"></s:file>
     8             <input type="button" value="Add More.." onclick="addMore()">
     9         </td>
    10  </tr>
    11 <tr>
    12         <td><s:submit type="button" value="submit" onclick="return checkf()"/></td>
    13         <td><s:reset value="reset "></s:reset></td>
    14     </tr>
    15 </table>
    16 <table align="center" width="50%" border="1">
    17 <tr>
    18 <td>测试.txt</td>
    19 <td>
    20      <a href="<s:url value='download.action'><s:param name='fileName'>测试.txt</s:param> </s:url>">下载</a>
    21 </td>
    22 </tr>
    23 </table>
    24 </s:form>
    25 </body>
    复制代码

      创建result.jsp页面

    复制代码
     1 <body>
     2 <s:form>
     3     <div style="border:1px solid black">成功上传的文件:<br>
     4         <ul style="list-style-type:decimal">
     5     <s:iterator value="#request.fileName" id="file" status="status">
     6             <li><s:property/> </li>
     7     </s:iterator>
     8         </ul>
     9     </div>
    10 </s:form>
    11 </body>
    复制代码

    当然别忘了在每个页面上都添加上struts2 标签引用<%@taglib prefix="s" uri="/struts-tags" %>

    二、创建updown.js文件,在index.jsp中引用

    复制代码
     1 function checkf(){
     2     var files =    document.getElementsByName("file");
     3     if(files[0].value.length!=0){
     4             return true;
     5      }else{
     6         alert("请选择文件");
     7         return false;
     8      }
     9 }
    10 function addMore()
    11 {
    12    var td = document.getElementById("more");
    13     var br = document.createElement("br");
    14     var input = document.createElement("input");
    15     var button = document.createElement("input");
    16     input.type = "file";
    17     input.name = "file";
    18     button.type = "button";
    19     button.value = "Remove";
    20      button.onclick = function()
    21     {
    22         td.removeChild(br);
    23         td.removeChild(input);
    24         td.removeChild(button);
    25     }
    26       td.appendChild(br);
    27     td.appendChild(input);
    28     td.appendChild(button);
    29 }
    复制代码

    三、创建upDownloadAction.java

    复制代码
      1 package com.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.InputStream;
      8 import java.io.OutputStream;
      9 import java.io.UnsupportedEncodingException;
     10 import java.util.List;
     11 import javax.servlet.http.HttpServletRequest;
     14 import com.opensymphony.xwork2.ActionSupport;
     15 import org.apache.struts2.ServletActionContext;
     16 
     17 public class UpDownloadAction extends ActionSupport {
     18 
     19     private static final long serialVersionUID = 1L;
     20     private List<File> file;// 对应jsp中file标签
     21     private List<String> fileFileName;//  
     22     private List<String> fileContentType;//  
     23     private String fileName;//获得jsp中pram参数
     24     @SuppressWarnings("deprecation")
     25     // 文件上传
     26     public String uploadFiile() throws Exception {
     27         String root = ServletActionContext.getServletContext().getRealPath(
     28                 "/upload");// 上传路径
     29         System.out.println(root);
     30         InputStream inputStream;
     31         File destFile;
     32         OutputStream os;
     33         for (int i = 0; i < file.size(); i++) {
     34             inputStream = new FileInputStream(file.get(i));
     35             destFile = new File(root, this.getFileFileName().get(i));
     36             os = new FileOutputStream(destFile);
     37             byte[] buffer = new byte[400];
     38             int length = 0;
     39             while ((length = inputStream.read(buffer)) > 0) {
     40                 os.write(buffer, 0, length);
     41             }
     42             inputStream.close();
     43             os.close();
     44         }
     45         HttpServletRequest request = ServletActionContext.getRequest();
     46         request.setAttribute("fileName", fileFileName);
     47         return SUCCESS;
     48     }
     49 
     50     // 文件下载
     51     public InputStream getDownloadFile() throws FileNotFoundException,
     52             UnsupportedEncodingException {
     53         System.out.println(getFileName());
     54 
     55         // 如果下载文件名为中文,进行字符编码转换
     56         ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;fileName="
     57                         + java.net.URLEncoder.encode(fileName, "UTF-8"));
     58         InputStream inputStream = new FileInputStream("F:/"  //使用绝对路径 ,从该路径下载“测试.txt"文件
     59                 + this.getFileName());
     60         System.out.println(inputStream);
     61         return inputStream;
     62     }
     63 
     64     // 下载
     65     public String downloadFile() throws Exception {
     66         return SUCCESS;
     67     }
     68 
     69     public String getFileName() throws UnsupportedEncodingException {
     70         return fileName;
     71     }
     72 
     73     public void setFileName(String fileName)
     74             throws UnsupportedEncodingException {
     75         this.fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
     76     }
     77  }
    复制代码

    注:属性的 get和set方法已省略。

    四、最后是配置文件

    1、web.xml配置

    复制代码
    1     <filter>  
    2         <filter-name>struts2</filter-name>  
    3         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
    4     </filter>  
    5        
    6     <filter-mapping>  
    7         <filter-name>struts2</filter-name>  
    8         <url-pattern>/*</url-pattern>  
    9     </filter-mapping> 
    复制代码

    2、struts.xml配置

    复制代码
     1 <struts>  
     2    <constant name="struts.i18n.encoding" value="utf-8"></constant>
     3    <constant name="struts.multipart.saveDir" value="f:"></constant>
     4    <package name="struts2" extends="struts-default">
     5        <action name="upload" class="com.action.UpDownloadAction" method="uploadFiile">
     6            <result name="success">/jsp/result.jsp</result>
     7            <interceptor-ref name="fileUpload">
     8 <!--maximumSize (可选) - 这个拦截器允许的上传到action中的文件最大长度(以byte为单位).
     9     注意这个参数和在webwork.properties中定义的属性没有关系,默认2MB-->
    10                 <param name="maximumSize">409600</param>
    11 <!--allowedTypes (可选) - 以逗号分割的contentType类型列表(例如text/html),
    12 这些列表是这个拦截器允许的可以传到action中的contentType.如果没有指定就是允许任何上传类型.-->
    13                 <param name="allowedTypes">
    14                     text/plain
    15                 </param>
    16             </interceptor-ref>
    17             <interceptor-ref name="defaultStack"></interceptor-ref>
    18        </action>
    19        <action name="download" class="com.action.UpDownloadAction" method="downloadFile" >
    20             <result name="success" type="stream">
    21             <!--指定文件下载类型     application/octet-stream默认值可以下载所有类型    -->
    22                 <param name="contentType">
    23                     application/txt;
    24                 </param>
    25             <!-- 指定下载的文件名和显示方式 ,但注意中文名的乱码问题,解决办法是:进行编码处理-->
    26             <!--contentDisposition是文件下载的处理方式,包括内联(inline)和附件(attachment),
    27             默认是inline, 使用附件时这样配置:attachment;filename="文件名" 。-->
    28                 <param name="contentDisposition">
    29                   attachment;filename="${fileName}"
    30                 </param>
    31             <!--由getDownloadFile()方法获得inputStream-->
    32                 <param name="inputName">downloadFile</param>
    33 <!--                指定下载文件的缓存大小-->
    34                 <param name="bufferSize">2048</param>
    35             </result>
    36         </action>
    37    </package>
    38 </struts>  
    复制代码

    一个简单的Struts2的多文件文件上传和单文件下载就实现了

  • 相关阅读:
    POJ 2175 Evacuation Plan 费用流 负圈定理
    POJ 2983 Is the Information Reliable? 差分约束
    codeforces 420B Online Meeting
    POJ 3181 Dollar Dayz DP
    POJ Ant Counting DP
    POJ 1742 Coins DP 01背包
    中国儒学史
    产品思维30讲
    Java多线程编程核心技术
    编写高质量代码:改善Java程序的151个建议
  • 原文地址:https://www.cnblogs.com/songjinduo/p/4590476.html
Copyright © 2011-2022 走看看