SpringBoot实现文件下载功能不需要什么额外的依赖,仅涉及到了java对文件流相关的操作。简单说操作流程就是:
加载文件 => 读取文件流 => 把文件流写入到HttpServletResponse中
废话少说,直接上代码。
@GetMapping("/download") @ResponseBody public String download(HttpServletRequest request, HttpServletResponse response) { //下载的文件路径 String filePath = "/Users/liqingcan/Desktop/1.pdf"; //下载后的文件名 String fileName = "测试文件下载.pdf"; //使用流的形式下载文件 try { //加载文件 File file = new File(filePath); InputStream is = new BufferedInputStream(new FileInputStream(file)); byte[] buffer = new byte[is.available()]; is.read(buffer); is.close(); // 清空response response.reset(); // 设置response的Header response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); response.addHeader("Content-Length", "" +file.length()); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); return ""; } catch (Exception e) { e.printStackTrace(); return "文件下载出错"; } }
这里只显示了controller中的代码,因为主要也就这部分代码。简单介绍下:
filePath是在服务器上要被下载的文件1.pdf的路径,之后会通过这个路径实例化一个File对象紧接着读取相关的文件流
fileName是最终在浏览器上显示的文件名
使用response流输出文件来下载方法是可以不用有返回值的,但是我为了在下载的时候如果出现异常能进行提示,这里使用了String和@ResponseBody注解,在发生异常的时候可以输出错误信息到页面上