SpringMVC-20-springmvc文件下载

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 SpringMVC-20-springmvc文件下载,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

13.Spring MVC文件下载

  • 文件下载就是将服务器中的文件下载到本地

  • 两种方式:

  • 通过超链接实现下载:暴露了下载文件的真实位置,并且只能下载 Web 应用程序下公开的目录文件,WEB-INF 目录除外。
  • 编码实现下载:增强安全访问控制,可以下载除 Web 应用程序所在目录以外的文件,也可以将文件保存到数据库中。
  • 编码实现下载需要设置以下两个报头
  1. Web 服务器需要告诉浏览器其所输出内容的类型不是普通文本文件或 HTML 文件,而是一个要保存到本地的下载文件,这需要设置 Content-Type 的值为 application/x-msdownload或multipart/form-data二进制数据。
  2. Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。
  • 这两个报头指定了浏览器处理数据的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户选择。在 attachment 后面还可以指定 filename 参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。
response.setContentType("multipart/form-data");//二进制传输数据
response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
  • 举例:沿用前面文件上传的控制器
  • 在控制器中,提供文件列表页面filespage.jsp可供下载
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>文件列表</title>
</head>
<body>
<table border="1px">
    <thead>
    <tr>
        <th>文件序号</th>
        <th>文件</th>
    </tr>
    </thead>
    <tbody>
    <c:forEach var="filename" items="${files}" varStatus="status">
        <tr>
            <td>${status.count}</td>
            <td><a href="${pageContext.request.contextPath}/file/down1/${filename}">${filename}</a></td>
        </tr>
    </c:forEach>
    </tbody>
</table>
</body>
</html>
@RequestMapping("/showFiles")
public String showFiles(HttpSession session,Model model) throws IOException {
    String uploadPath = session.getServletContext().getRealPath("/WEB-INF/upload");
    File fileDir = new File(uploadPath);
    ArrayList<String> filename = new ArrayList<>();
    File[] files = fileDir.listFiles();
    for (File file:  files) {
        filename.add(file.getName());
    }
    model.addAttribute("files",filename);
    return "filespage";
}
  • 在控制器类中,提供文件下载方法进行下载。
@RequestMapping("/down1/{filename}")
public String down(@PathVariable("filename")String filename, HttpSession session, HttpServletResponse response,Model model) throws IOException {
    //要下载的文件地址
    String uploadPath = session.getServletContext().getRealPath("/WEB-INF/upload");
    //web下载文件的头部
    //设置文件响应头
    response.reset();  //页面不缓存,清空buffer
    response.setCharacterEncoding("utf-8"); //字符编码
    response.setContentType("multipart/form-data");//二进制传输数据
    //URLEncoder.encode(fileName,"utf-8")对中文进行编码否则会乱码
    response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(filename,"utf-8"));
    FileInputStream fis = new FileInputStream(new File(uploadPath,filename));
    ServletOutputStream os = response.getOutputStream();
    int len = 0;
    byte[] bytes = new byte[1024];
    while ((len=fis.read(bytes))!=-1){
        os.write(bytes,0,len);
    }
    os.close();
    fis.close();
    model.addAttribute("msg",filename+"下载成功");
    return "result3";
}
  • 效果:访问http://localhost:8080/file/showFiles
    在这里插入图片描述
    在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123882.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!