SpringBoot文件下载-几行代码实现文件下载接口-FileSystemResource用于文件下载-用户下载大文件产生OOM异常解决方案。

SpringBoot文件下载-几行代码FileSystemResource实现文件下载接口-FileSystemResource用于流式文件下载。

SpringBoot文件下载-几行代码实现文件下载接口-FileSystemResource用于文件下载-用户下载大文件产生OOM异常解决方案。_第1张图片

随后找不到几篇入门关于使用FileSystemResource实现文件下载的文章。便有了本文。

首先:本文的文件下载指的是文件从服务器到用户客户端(浏览器)的过程。

要点:1.使用FileSystemResource类加载文件

              2.设置ContentDisposition响应头

              3. ResponseEntity封装返回

 为什么要使用FileSystemResource来加载文件?

1.省去了繁琐的手写file转成bytes的流程。

3.可以避免用户客户端下载大文件产生oom问题,记一次生产环境因SpringBoot大文件下载导致的OOM事故 - Mr.Peng - OSCHINA - 中文开源技术交流社区

代码如下:

@GetMapping("/dowfile2")
//注意返回类型 使用的是spring提供的ResponseEntity
public ResponseEntity dowfile2(){
    //使用 spring的FileSystemResource类加载文件。
    //new FileSystemResource() 可传入的参数有多种,按需选择
    FileSystemResource fileSystemResource=new FileSystemResource("C:\\Users\\DubaiJun\\Desktop\\断点续传\\demo\\作答.png");

    //需要设置响应头的Content-Disposition字段,让浏览器知道是下载文件.
    //若不设置该响应头字段,浏览器就会以读取文本文件的方式展示。
    HttpHeaders headers = new HttpHeaders();
    headers.setContentDisposition(ContentDisposition.attachment().filename(fileSystemResource.getFilename()).build());
    //headers.add("Content-Disposition", "attachment;filename=fileSystemResource.getFilename()");  //等价于上行代码
    
    //封装返回对象
    //ResponseEntity类大有学问,建议研读
    return ResponseEntity
            .ok()
            .headers(headers)
            .body(fileSystemResource);
}

//这样使用浏览器访问/dowfile2就可以下载该文件了


 

注意文件下载可能出现文件名乱码等问题,

本文暂不给解决方案。

你可能感兴趣的:(springboot,spring,boot,java,后端)