文件下载比较简单,直接在页面给出一个超链接,该链接 href 的属性等于要下载的文件的文件名,就可以实现文件下载了。但是如果该文件的文件名为中文文件名,在某些早期的浏览器上就会导致下载失败;如果使用最新的 Firefox、Opera、Chrome、Safari 则都可以正常下载文件名为中文的文件了。
Spring MVC 提供了一个 ResponseEntity 类型,使用它可以很方便地定义返回的 HttpHeaders 和 HttpStatus。
download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h3>文件下载</h3> <a href="download?filename=${requestScope.user.image.originalFilename }"> ${requestScope.user.image.originalFilename } </a> </body> </html> |
UploadFile.java
@RequestMapping(value="/download") public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename, Model model) throws IOException { //下载文件路径 String path = request.getServletContext().getRealPath("/images/"); File file = new File(path+File.separator+filename); HttpHeaders headers = new HttpHeaders(); //下载显示的文件名,解决中文名称乱码问题 String downloadFileName = new String(filename.getBytes("UTF-8"),"iso-8859-1"); //通知浏览器以attachment(下载方式)打开图片 headers.setContentDispositionFormData("attachment", downloadFileName); //application/octet-stream:二进制流数据(最常见的文件下载 headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); //201 HttpStatus.CREATED return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED); } } |
download 处理方法接收到页面传递的文件名 filename 后,使用 Apache Commons FileUpload 组件的 FileUtils 读取项目的 images 文件夹下的该文件,并将其构建成 ResponseEntity 对象返回客户端下载。
使用 ReponseEntity 对象,可以很方便地定义返回的 HttpHeader 和 HttpStatus。上面代码中的 MediaType,代表的是 Internet Media Type,即互联网媒体类型,也叫做 MIME 类型。在 Http 协议消息头中,使用 Content-Type 来表示具体请求中的媒体类型信息。HttpStatus 类型代表的是 Http 协议中的状态。