Spring Boot基础学习笔记15:实现文件下载功能

零、学习目标

  1. 掌握利用Spring Boot实现文件下载功能

一、文件下载概述

下载文件能够通过IO流实现,所以多数框架并没有对文件下载进行封装处理。文件下载时涉及到不同浏览器的解析处理,可能会出现中文乱码的情况,因此需要设法解决中文乱码问题。

二、实现文件下载功能

(一)创建Spring Boot项目

  • 创建FileDownloadDemo项目,添加Web、Thymeleaf依赖
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 在pom.xml里引入文件下载的一个工具类依赖commons-io
    在这里插入图片描述
<dependency>                             
    <groupId>commons-io</groupId>        
    <artifactId>commons-io</artifactId>  
    <version>2.6</version>               
</dependency>                            

(二)整合Bootstrap

  • 将第14讲项目FileUploadDemo的resources/static里的bootstrap-4.0.0拷贝到当前项目相应位置
    在这里插入图片描述
    在这里插入图片描述

(三)准备待下载文件

  • 在D盘创建下载目录,存放待下载文件
    在这里插入图片描述
  • 一个是纯英文文件名,一个是中英文文件名

(四)编写文件下载页面

  • 在templates目录里创建文件下载页面 - filedownload.html
    在这里插入图片描述
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,shrink-to-fit=no">
    <link th:href="@{/bootstrap-4.0.0/css/bootstrap}" rel="stylesheet">
    <script th:src="@{/bootstrap-4.0.0/js/jquery-3.4.1.js}"></script>
    <script th:src="@{/bootstrap-4.0.0/js/bootstrap.bundle.js}"></script>
    <script th:src="@{/bootstrap-4.0.0/js/bootstrap.js}"></script>
    <title>文件下载</title>
</head>
<body>
<div class="w-50 m-auto bg-info">
    <h3 class="h3">文件下载</h3>
    <label>Spring Boot.txt</label>
    <a th:href="@{/downloadFile(filename='Spring Boot.txt')}">下载</a><br/>
    <label>Spring Boot开发基础.txt</label>
    <a th:href="@{/downloadFile(filename='Spring Boot开发基础.txt')}">下载</a>
</div>
</body>
</html>

(五)编写文件下载控制器

在这里插入图片描述

package net.hw.lesson15.controller;

import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.io.File;

/**
 * 功能:文件下载控制器
 * 作者:华卫
 * 日期:2021年03月01日
 */
@Controller
public class FileDownloadController {
    
    
    @RequestMapping("/toFileDownload")
    public String toDownload(HttpServletRequest request) {
    
    
        return "filedownload";
    }

    @RequestMapping("/downloadFile")
    public ResponseEntity<byte[]> downloadFile(String filename) {
    
    
        // 定义下载文件所在的位置
        String dir="D:/download";
        File file = new File(dir + File.separator + filename);
        // 设置响应头
        HttpHeaders httpHeaders = new HttpHeaders();
        // 让浏览器以附件,即下载的方式打开
        httpHeaders.setContentDispositionFormData("attachment", filename);
        // 定义以流的形式返回数据
        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        try {
    
    
            return new ResponseEntity<>(FileUtils.readFileToByteArray(file), httpHeaders, HttpStatus.OK);
        } catch (Exception e) {
    
    
            e.printStackTrace();
            // 重新实例化headers,否则前台不会显示出错信息
            httpHeaders = new HttpHeaders();
            httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            return new ResponseEntity<>(e.getMessage().getBytes(), httpHeaders, HttpStatus.EXPECTATION_FAILED);
        }
    }
}

(六)启动应用,测试效果

  • 访问http://localhost:8080/toFileDownload
    在这里插入图片描述
  • 查看下载的文件
    在这里插入图片描述
  • 大家可以看到,下载纯英文文件名的文件,一切正常,但是文件名包含中文,下载后的文件名就会出现乱码问题。
  • 删除下载目录里的Spring Boot.txt,再次下载该文件,查看结果,页面显示错误信息
    在这里插入图片描述

三、解决中文名文件乱码问题

(一)在文件下载控制器里编写获取文件名方法

在这里插入图片描述

(二)修改文件下载控制器里的downloadFile方法

在这里插入图片描述

(三)启动应用,测试效果

在这里插入图片描述
在这里插入图片描述

  • 可以看到,下载中文文件名也不会出现乱码了。

四、课后拓展练习

  • 修改代码,下载其他类型的文件并测试。

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/114254546