• SpringMVC-20-springmvc文件下载


    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"));
    
    • 1
    • 2
    • 举例:沿用前面文件上传的控制器
    • 在控制器中,提供文件列表页面filespage.jsp可供下载
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    
        文件列表
    
    
    
            
    文件序号 文件
    ${status.count} ${filename}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    @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 filename = new ArrayList<>();
        File[] files = fileDir.listFiles();
        for (File file:  files) {
            filename.add(file.getName());
        }
        model.addAttribute("files",filename);
        return "filespage";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 在控制器类中,提供文件下载方法进行下载。
    @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";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 效果:访问http://localhost:8080/file/showFiles
      在这里插入图片描述
      在这里插入图片描述
  • 相关阅读:
    10.ElasticSearch系列之深入搜索
    国内MES系统应用研究报告:“企业MES应用现状”| 百世慧®
    【Hadoop实战】Hadoop指标系统V2分析
    systemverilog学习 --- 代码重用
    阿里云通义千问14B模型开源!性能超越Llama2等同等尺寸模型
    14:Hadoop数据分析|节点管理|搭建NFS网关服务
    UM2080F32——32位SoC芯片
    plt函数显示图片 & 在图片上画边界框 & 边界框坐标转换
    WARNING: There was an error checking the latest version of pip.
    风控特征的优化分箱,看看这样教科书的操作
  • 原文地址:https://blog.csdn.net/weixin_42045639/article/details/126001187