SpringMVC文件下载
基于此篇文章中的一些没有注释的相关问题,今天进行SpringMVC的文件下载的更新:
新方法:
1.控制层,新建一个方法,返回值类型为ResponseEntity<byte[]>的方法,并在其函数的后面添加对应的后台需要处理的参数,比如可以传递FIleName
1 2 3 4 5 6 7 8 9 10 11 | /** * 文件下载 * * @param id * @return */ @GetMapping ( "/download/" ) public ResponseEntity< byte []> download( @PathVariable ( "id" ) String id) throws IOException { File file = xxxService.buildXlsFileById(id); return ResponseUtils.buildResponseEntity(file); } |
2. 编写service返回File文件对象,从Service层中查询数据库操作,并查询文件真正的路径位置,然后返回File对象
1 2 3 4 5 | public File buildXlsById(String id){ //do something to find this file File file= new File( "1.txt" ); return file; } |
3. 编写ResponseUtils中的相关方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /** * 构建下载类 * @param file * @return * @throws IOException */ public static ResponseEntity< byte []> buildResponseEntity(File file) throws IOException { byte [] body = null ; //获取文件 InputStream is = new FileInputStream(file); body = new byte [is.available()]; is.read(body); HttpHeaders headers = new HttpHeaders(); //设置文件类型 headers.add( "Content-Disposition" , "attchement;filename=" + file.getName()); //设置Http状态码 HttpStatus statusCode = HttpStatus.OK; //返回数据 ResponseEntity< byte []> entity = new ResponseEntity< byte []>(body, headers, statusCode); return entity; } |
4.编写相对应得URL即可
老方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | /** * 文件下载 * @Description: * @param fileName * @param request * @param response * @return */ @RequestMapping ( "/download" ) public String downloadFile( @RequestParam ( "fileName" ) String fileName, HttpServletRequest request, HttpServletResponse response) { if (fileName != null ) { String realPath = request.getServletContext().getRealPath( "WEB-INF/File/" ); File file = new File(realPath, fileName); if (file.exists()) { response.setContentType( "application/force-download" ); // 设置强制下载不打开 response.addHeader( "Content-Disposition" , "attachment;fileName=" + fileName); // 设置文件名 byte [] buffer = new byte [ 1024 ]; FileInputStream fis = null ; BufferedInputStream bis = null ; try { fis = new FileInputStream(file); bis = new BufferedInputStream(fis); OutputStream os = response.getOutputStream(); int i = bis.read(buffer); while (i != - 1 ) { os.write(buffer, 0 , i); i = bis.read(buffer); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally { if (bis != null ) { try { bis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (fis != null ) { try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } return null ; } |
__EOF__

本文作者:lonecloud
本文链接:https://www.cnblogs.com/lonecloud/p/5990060.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/lonecloud/p/5990060.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架