提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
1.使用ResourceLoader来加载根目录中的文件
2.从文件输入流读取数据,并写入响应输出流中,实现文件下载
目录结构:
代码如下(示例):
package org.example.controller;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private ResourceLoader resourceLoader;
@PostMapping("/downloadTemplate")
public void downloadTemplate(HttpServletResponse response) {
try {
// 模板文件名编码为UTF-8格式,确保中文文件名不会出现乱码
String filename = URLEncoder.encode("模板.zip", StandardCharsets.UTF_8);
// 加载位于类路径下的模板文件
Resource resource = resourceLoader.getResource("classpath:template/模板.zip");
// 设置响应头,告知浏览器下载文件,并指定文件名
response.setContentType("application/x-download");
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
try (ServletOutputStream out = response.getOutputStream();
InputStream stream = resource.getInputStream()) {
byte buff[] = new byte[1024];
int length;
// 从文件输入流读取数据,并写入响应输出流中,实现文件下载
while ((length = stream.read(buff)) > 0) {
out.write(buff, 0, length);
}
out.flush(); // 刷新输出流,确保所有数据都被发送到客户端
}
} catch (IOException e) {
e.printStackTrace(); // 输出异常信息,便于排查问题
}
}
}