sprinboot 文件下载
时间: 2023-12-17 15:03:45 浏览: 28
在Spring Boot中实现文件下载可以使用以下步骤:
1. 在Controller中定义一个接口,接口中包含文件下载的请求和响应参数。
2. 在方法中使用Java IO或Spring的ResourceUtils类读取文件并设置响应的ContentType和Header。
3. 将文件内容写入响应的输出流中,完成文件下载。
以下是一个示例代码:
```java
@GetMapping("/download")
public ResponseEntity<Resource> downloadFile() throws IOException {
// 读取文件
File file = ResourceUtils.getFile("classpath:test.pdf");
// 设置响应头
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment; filename=test.pdf");
// 创建Resource对象
InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
// 返回响应实体
return ResponseEntity.ok()
.headers(headers)
.contentLength(file.length())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(resource);
}
```
在以上示例中,我们使用了ResourceUtils类读取了一个名为test.pdf的文件,并将文件内容写入了响应的输出流中。同时,我们还设置了Content-Disposition头,用于告知浏览器将响应内容作为文件下载。
需要注意的是,我们在创建ResponseEntity时使用了InputStreamResource对象作为响应的实体,这是因为Spring Boot提供了该类来封装输入流,方便我们将文件内容写入响应的输出流中。
除了以上方法,我们还可以使用Servlet API中的ServletResponse对象来完成文件下载。以下是一个示例代码:
```java
@GetMapping("/download")
public void downloadFile(HttpServletResponse response) throws IOException {
// 读取文件
File file = ResourceUtils.getFile("classpath:test.pdf");
// 设置响应头
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=test.pdf");
// 将文件内容写入响应的输出流中
OutputStream out = response.getOutputStream();
InputStream in = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.flush();
}
```
以上代码中,我们使用了HttpServletResponse对象来设置响应头,并将文件内容写入了响应的输出流中。需要注意的是,我们在写入文件内容时使用了缓冲区,以提高性能。同时,我们还在最后使用flush方法将缓冲区中的数据写入输出流中。
无论使用哪种方法,Spring Boot都提供了方便的方式来实现文件下载功能。需要我们注意的是,在实现文件下载时,我们要确保文件的安全性,并防止恶意用户利用下载功能攻击系统。