SpringMVC提供了一个ResponseEntity类型,使用他可以很方便的定义返回的HttpHeaders和HttpStatus.
1.控制器
@RequestMapping("/download") public ResponseEntity<byte[]> download( HttpServletRequest request, @RequestParam("filename") String filename, Model model ) throws Exception { //下载文件路径 String path = request.getServletContext().getRealPath("/images/"); File file = new File(path+File.separator+filename); HttpHeaders headers = new HttpHeaders(); //下载显示的文件名,解决中文名称乱码 String downloadFileNmae = new String(filename.getBytes("UTF-8"),"iso-8859-1"); //通知浏览器以attachment方法打开图片 headers.setContentDispositionFormData("attachment", downloadFileNmae); //applicatoin/octet-stream 二进制流数据 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //201 http状态码 CREATED return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED); }
download处理方法接收到页面传递的文件名filename后,使用ApacheCommonsFileUpload组件的FileUtils读取项目images文件夹下的文件,并将其构建成ResponseEntity对象返回客户端下载.
使用ResponseEntity对象,可以很方便的定义返回的HttpHeaders和HttpStatus.上面代码中的MediaType,代表的是Internet Media Type,即互联网媒体类型,也叫做MIME类型.在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息.HttpStatus类型代表的是Http协议中的状态,有关MediaType和HttpStatus类的详细信息参考SpringMVC的API文档.