SpringMVC的文件下载

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文档.