Struts2实现单文件上传,多文件上传与下载(十)下

简介: Struts2实现单文件上传,多文件上传与下载(十)

五. 文件下载


在下载时,只需要指定文件的名称,就会去相应的文件目录中去寻找,去下载。


在该项目下新建一个upload文件夹,里面放置一些文件。


四.一 下载前查询所有的文件


一般在下载之前,会将可以下载的文件以列表的形式进行显示,或者将那个文件进行相应的显示。


五.一.一 创建 ShowFileAction


ShowFileAction中:


package com.yjl.web.action;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import com.yjl.pojo.User;
import com.yjl.utils.BaseAction;
/**
* @author 两个蝴蝶飞
* @version 创建时间:Aug 28, 2018 8:35:56 AM
* 关于文件上传和下载的Action实现
*/
public class ShowFileAction extends BaseAction<User>{
  private static final long serialVersionUID = 1L;
  private Logger logger=Logger.getLogger(FileAction.class);
  public String login(){
    String path=getUploadPath();
    logger.info("上传的路径是:"+path);
    return SUCCESS;
  }
  //要下载的文件
  private List<File> downFileList=new ArrayList<File>();
  public List<File> getDownFileList() {
    return downFileList;
  }
  public void setDownFileList(List<File> downFileList) {
    this.downFileList = downFileList;
  }
  public String downFileList(){
    //1.找到path路径
    String path=ServletActionContext.getServletContext().getRealPath("/upload");
    File pFile=new File(path);
    //2.找到pFile文件夹下及下属文件夹下所有的文件。
    List<File> temp=new ArrayList<File>();
    //3.将所有的文件都放置到列表中
    downFileList=ergodic(pFile, temp);
    logger.info("长度是:"+downFileList.size());
    //4. 将集合转换成数组
    return "downFileList";
  }
  private List<File> ergodic(File file,List<File> resultFileList){
    if(file==null||!file.exists()){
      return new ArrayList<File>();
    }
        File[] files = file.listFiles();
        if(files==null||files.length<=0){
      return new ArrayList<File>();
    }
        for (File f : files) {
            if(f.isDirectory()){// 判断是否文件夹
                ergodic(f,resultFileList);// 调用自身,查找子目录
            }else{
              resultFileList.add(f);
            }   
        }
        return resultFileList;
    } 
}


在Action中看有的人是用的File []数组,这里用集合了,也是可以的。


五.一.二 配置 struts.xml 文件


在struts.xml中是正常的配置。


<!-- 下载文件显示 -->
    <action name="ShowFile_*" class="com.yjl.web.action.ShowFileAction" method="{1}">
        <result name="success">/WEB-INF/content/success.jsp</result>
        <result name="downFileList">/WEB-INF/content/list.jsp</result>
    </action>


五.一.三 编写 /content/list.jsp 页面


<body>
  这是可以下载文件的列表<br/>
  <s:iterator value="downFileList" var="f">
    <s:property value="#f.name"/><s:a action="getDownFile?fileName=%{#f.name}" namespace="/">下载</s:a>
    <br/>
  </s:iterator>
</body>


五.一.四 重启服务器,验证界面


输入网址: http://localhost:8080/Struts_File/ShowFile_downFileList


会显示可以下载的文件:


20200414085105254.png


五.二 下载文件


五.二.一 编写 DownFileAction


主要的Action代码:


public class DownFileAction extends ActionSupport{
  private static final long serialVersionUID = 1L;
    //@param fileName 下载时传入的文件名
    private String fileName;
    //下载时,显示的文件名
    private String showFileName;
    //文件类型
    private String contentType;
    public String getFileName() {
      return this.fileName;
    }
    public void setFileName(String fileName) {
      //如果前台传入的是中文乱码,那么需要进行乱码处理.
      //如果前台传入的不是乱码,那么不需要进行处理。 
      this.fileName=fileName;
      /*try {
        this.fileName=new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }*/
    }
     /**
       * 获取文件的类型
       */
      public String getContentType() {
          return ServletActionContext.getServletContext().getMimeType(fileName);
      }
      public void setContentType(String contentType) {
          this.contentType = contentType;
      }
    public String getShowFileName() {
         return showFileName;
    }
    public void setShowFileName(String showFileName) {
      this.showFileName=showFileName;
    }
    public InputStream  getDownloadFile() throws Exception{
      //设置一下,展示的名称。
      setShowFileName(fileName);
      String realPath=File.separator+"upload"+File.separator+fileName;
      InputStream is=ServletActionContext.getServletContext().getResourceAsStream(realPath);
      return is;
    }
    public String download(){
      return SUCCESS;
    }
}


五.二.二 配置struts.xml 文件


<!-- 配置下载页面 -->
<action name="getDownFile" class="com.yjl.web.action.DownFileAction" method="download">
      <!--下载时候的配置-->
      <result type="stream">  
         <!--文件类型 -->
        <param name="contentType">${contentType}</param>
        <!-- 下载的文件数据存放的方法,该方法返回一个InputStream   
        例如取值为inputStream的属性需要编写getInputStream()方法-->  
        <param name="inputName">downloadFile</param>  
        <!--下载时,客户端显示的下载的文件名 -->  
        <param name="contentDisposition">attachment;filename=${showFileName}</param> 
        <!-- 数据的缓冲大小 -->  
        <param name="bufferSize">1024</param> 
          <!--解决中文文件名乱码-->
          <param name="encode">true</param>
      </result>  
</action>


五.二.三 下载验证


输入网址: http://localhost:8080/Struts_File/ShowFile_downFileList


点击链接,可以进行下载, 但是下载中文时, 火狐浏览器会乱码,而谷歌浏览器正常。


本章节的代码链接为:


链接:https://pan.baidu.com/s/1P9bA-OX__modBaQHg7HO6g 
提取码:lm3v


谢谢您的观看!!!

相关文章
|
9月前
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置2
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置2
27 0
|
9月前
|
前端开发
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置3
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置3
37 0
|
9月前
|
前端开发 文件存储 数据库
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置1
SpringMVC文件上传、文件下载多文件上传及jrebel的使用与配置1
47 0
|
1月前
SpringMVC之文件上传和下载
【1月更文挑战第20天】SpringMVC之文件上传和下载
29 1
|
1月前
|
Java
Struts文件上传与下载详解_上传单个文件
Struts文件上传与下载详解_上传单个文件
12 0
|
1月前
|
Java
Struts文件上传与下载详解 _上传多个文件
Struts文件上传与下载详解 _上传多个文件
24 0
|
1月前
|
存储 前端开发 Java
SpringMVC 文件上传和下载
SpringMVC 文件上传和下载
15 0
|
7月前
|
存储 前端开发 Java
SpringMVC的文件上传&文件下载&多文件上传---详细介绍
SpringMVC的文件上传&文件下载&多文件上传---详细介绍
43 0
|
前端开发 Java Maven
SpringMVC文件上传与下载
SpringMVC文件上传与下载
|
前端开发 Java Maven
【SpringMVC 从 0 开始】文件上传和下载
【SpringMVC 从 0 开始】文件上传和下载
【SpringMVC 从 0 开始】文件上传和下载