Springboot下载jar包中的文件

Spring boot中下载文件的2种方式

  1. 通过HttpServletResponse的OutputStream实现
    Spring MVC的下载功能
  2. 通过ResponseEntity实现
    使用Spring Boot的流媒体响应(StreamingResponseBody)功能
    两种方法都可以实现文件的下载。
    第一种方法适合下载较小的文件,而第二种方法则更适合下载大文件,因为它可以在处理过程中避免一次性加载整个文件到内存中,因此也被称为流式下载。

示例代码

主要展示一下方式二的写法
project
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── AppConfig.java
│ │ └── resources
│ │ └── application.properties
│ └── …


@RestController  
public class MyController {  
      
    @GetMapping("/download")  
    public ResponseEntity<Object> downloadFile() {  
    	//获取jar包中文件
        ClassPathResource classPathResource = new ClassPathResource("application.properties"); 
        Resource resource = new InputStreamResource(classPathResource.getInputStream());
        String filename = classPathResource.getFilename();
        //设置响应头
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"");
        headers.add(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate");
        headers.add(HttpHeaders.PRAGMA, "no-cache");
        headers.add(HttpHeaders.EXPIRES, "0");
        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(classPathResource.contentLength())
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(resource);
    }  
}

通过ClassPathResource 获取文件,jar中文件通常都是放在 src/main/resources 目录下。

常见错误

  1. cannot be resolved to absolute file path because it does not reside in the file system
    当尝试获取jar中的File对象时会报该错误。
    File file = classPathResource.getFile();
    本地IDEA执行项目时,执行方法不会报错,但是以jar包形式执行,调用时就会报错。文件的路径是

jar:file:/C:/Users/Administrator/Desktop/demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/application.properties