基于此篇文章中的一些没有注释的相关问题,今天进行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 ; } |
转载于:https://www.cnblogs.com/lonecloud/p/5990060.html