@Deprecated @RequestMapping("/download2/{suffix}/{filename}") public String download2(HttpServletRequest request, HttpServletResponse response, @PathVariable("suffix") String suffix, @PathVariable("filename") String filename) { String filenameWithSuffix = filename + "." +suffix; try { String path=request.getSession().getServletContext().getRealPath("download"); File file = new File(path + File.separator + filenameWithSuffix); // 以流的形式下载文件。 InputStream fis = new BufferedInputStream(new FileInputStream(file)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); response.reset(); // 清空response // 设置response的Header //response.addHeader("Content-Disposition", "attachment;filename=" + new String(filenameWithSuffix.getBytes(),"utf-8")); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filenameWithSuffix, "UTF-8")); response.addHeader("Content-Length", "" + file.length()); OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); toClient.write(buffer); toClient.flush(); toClient.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 返回值要注意,要不然就出现下面这句错误! //java+getOutputStream() has already been called for this response return null; } @RequestMapping("/download/{suffix}/{filename}") public ResponseEntity<byte[]> download(HttpServletRequest request, @PathVariable("suffix") String suffix, @PathVariable("filename") String filename) { String filenameWithSuffix = filename + "." +suffix; HttpHeaders headers = new HttpHeaders(); try { headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", URLEncoder.encode(filenameWithSuffix, "UTF-8")); String path=request.getSession().getServletContext().getRealPath("download"); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(new File(path + File.separator + filenameWithSuffix)), headers, HttpStatus.CREATED); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; }
第一个方法太low ^_^