基于此篇文章中的一些没有注释的相关问题,今天进行SpringMVC的文件下载的更新:
新方法:
1.控制层,新建一个方法,返回值类型为ResponseEntity<byte[]>的方法,并在其函数的后面添加对应的后台需要处理的参数,比如可以传递FIleName
/** * 文件下载 * * @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对象
public File buildXlsById(String id){ //do something to find this file File file=new File("1.txt"); return file; }
3. 编写ResponseUtils中的相关方法
/** * 构建下载类 * @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即可
老方法
/** * 文件下载 * @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; }