SpringBoot实现文件下载功能不需要什么额外的依赖,仅涉及到了java对文件流相关的操作。简单说操作流程就是:
加载文件 => 读取文件流 => 把文件流写入到HttpServletResponse中
Controller层代码如下:
@GetMapping("/download")
@ResponseBody
public String download(HttpServletRequest request, HttpServletResponse response) {
//下载的文件路径
String filePath = "/Users/liqingcan/Desktop/1.pdf";
//下载后显示的文件名
String fileName = "测试文件下载.pdf";
//使用流的形式下载文件
try (
InputStream is = this.getClass().getResourceAsStream(filePath);
OutputStream os = response.getOutputStream();
) {
byte[] bytes = StreamUtils.copyToByteArray(is);
response.reset();
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
response.addHeader("Content-Length", "" + bytes.length);
os.write(bytes);
os.flush();
return "";
} catch (Exception e) {
e.printStackTrace();
return "文件下载出错";
}
}
filePath是在服务器上要被下载的文件的路径,通过这个路径获取一个输入流用于读取文件内容
fileName是最终在浏览器上下载后显示的文件名
使用response流输出文件来下载方法是可以不用有返回值的,但是我为了在下载的时候如果出现异常能进行提示,这里使用了String和@ResponseBody注解,在发生异常的时候可以输出错误信息到页面上