<font size=4> web
一、
文件下载是web项目中经常使用的服务,在springmvc中经常使用ResponseEntity类来事项文件下载spring
二、ResponseEntity
ResponseEntity类实现响应头、文件数据(以字节存储)、状态封装在一块儿交给浏览器处理以实现浏览器的文件下载。简单的说ResponseEntity能够折这HttpHeaders和HttpStatus,经过对HttpHeaders和HttpStatus的设置能够使浏览器执行下载操做。浏览器
三、实现文件下载
步骤:mvc
- 获取到文件的存放的真实路径
- 根据接收到的文件名和文件真实路径建立文件实例(注意:这里不是建立一个文件,而是建立一个File型的实例)
- 设置响应头Content-Disposition浏览器根据这个响应头执行相应的操做和要下载的文件名
- 设置响应内容的MIME类型,以二进制流形式传输
- 返回ResponseEntity
具体代码:app
@RequestMapping("/download") public ResponseEntity<byte[]> download(@RequestParam("fileName") String fileName, HttpServletRequest req) throws IOException { // 获取文件存放的真实路径 String realPath = req.getServletContext().getRealPath("/WEB-INF/file"); //建立文件实例 File file = new File(realPath, fileName); //修改文件名的编码格式 String downloadFileName = new String(fileName.getBytes("UTF-8"), "UTF-8"); //设置httpHeaders,使浏览器响应下载 HttpHeaders headers = new HttpHeaders(); //告诉浏览器执行下载的操做,“attachment”告诉了浏览器进行下载,下载的文件 文件名为 downloadFileName headers.setContentDispositionFormData("attachment", downloadFileName); //设置响应方式为二进制,以二进制流传输 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); }
四、火狐浏览器测试
从图中咱们能够看到,咱们设置的Content-Disposition起效果,传输类型也为二进制。 测试