返回

如何从SpringBoot应用的resource目录下载文件

后端

轻松实现从 SpringBoot 应用下载文件

流式传输:高效文件传输

在 SpringBoot 中,资源目录(resource)用于存放各种静态资源,如图像、视频、文档等。想要从应用中下载这些文件,流式传输是一种高效的选择。这种方式分段发送文件,降低服务器内存开销,加快下载速度。

要实现流式传输,可在控制器中添加一个处理文件下载请求的方法,例如:

@GetMapping("/download")
public void downloadFile(HttpServletResponse response) throws IOException {
    // 获取文件路径
    String filePath = "classpath:resource/file.txt";
    
    // 设置 HTTP 响应头
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment; filename=\"file.txt\"");
    
    // 获取文件流并循环写入输出流
    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath);
    OutputStream outputStream = response.getOutputStream();
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inputStream.read(buffer)) > 0) {
        outputStream.write(buffer, 0, length);
    }
    
    // 关闭流
    inputStream.close();
    outputStream.close();
}

访问该 URL,即可在浏览器中下载文件。

HTTP 响应:完整文件传输

HTTP 响应是另一种下载文件的方法,将整个文件作为 HTTP 响应体发送给客户端。在控制器中添加如下方法,即可实现:

@GetMapping("/download")
public ResponseEntity<byte[]> downloadFile() throws IOException {
    // 获取文件路径
    String filePath = "classpath:resource/file.txt";
    
    // 获取文件字节数组
    byte[] bytes = Files.readAllBytes(Paths.get(filePath));
    
    // 设置 HTTP 响应头
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
    headers.setContentDisposition(ContentDisposition.attachment().filename("file.txt").build());
    
    // 返回 HTTP 响应
    return ResponseEntity.ok().headers(headers).body(bytes);
}

访问该 URL,同样可以下载文件。

打包资源文件夹中的模板

SpringBoot 中的资源文件夹中的模板可以被应用直接访问。若需要将模板打包成一个独立的文件,用于其他应用,可按以下步骤操作:

  1. 引入 thymeleaf 依赖。
  2. 禁用 thymeleaf 自动启用。
  3. 将模板文件复制到 resource/templates 文件夹中。
  4. 创建 META-INF/resources.xml 文件,指定要打包的模板。
  5. 运行 SpringBoot 应用,将资源文件夹中的模板打包成 JAR 文件。

解决文件大小异常问题

某些情况下,文件大小过大会导致无法下载。可采取以下措施解决:

  1. 增加服务器端的最大 HTTP 请求大小。
  2. 增加客户端的最大 HTTP 请求大小。
  3. 使用分块传输编码,将文件分块发送,避免因文件过大导致下载失败。

结语

本文介绍了从 SpringBoot 应用下载文件的方法,包括流式传输和 HTTP 响应。另外,还讲解了打包资源文件夹中的模板和解决文件大小异常问题。通过这些方法,可以轻松从 SpringBoot 应用下载文件,满足实际需求。

常见问题解答

  1. 如何自定义文件下载文件名?
    在 HTTP 响应头中设置 Content-Disposition,指定文件名。
  2. 如何控制文件下载速度?
    使用 ServletOutputStream 的 setWriteListener 方法,控制数据流的写入速度。
  3. 如何暂停和恢复文件下载?
    实现 ServletOutputStream 的 write() 方法,暂停和恢复数据写入。
  4. 如何在下载过程中显示进度条?
    使用 HttpServletResponse 的 setContentLength() 方法,设置文件大小,并在浏览器中使用 JavaScript 显示进度条。
  5. 如何处理文件下载中断的情况?
    使用 ServletContextListener 监听文件下载状态,中断后可重新下载。