Springboot下载jar包中的文件
Spring boot中下载文件的2种方式
- 通过HttpServletResponse的OutputStream实现
Spring MVC的下载功能 - 通过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 目录下。
常见错误
- 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