Spring MVC 文件下载

       文件下载比较简单,直接在页面给出一个超链接,该链接 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 协议中的状态。

阅读更多
个人分类: SSM
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭