文件下载
文件下载是指文件服务器上的文件下载到本机上,在SpringMVC中环境中,实现文件下载大致可分为两个步骤。
步骤1
在客户端也就是前端页面使用一个文件下载的超链接,该链接的href属性要指定后台文件下载的方法以及文件名(需要先在文件下载目录中添加了一个名称为“姓名.jpg”的文件),具体代码如下:
<a href="${pageContext.request.contextPath }/download?filename=<%=URLEncoder.encode("姓名.jpg","UTF-8") %>">文件下载</a>
其中若使用<%=URLEncoder.encode(“姓名.jpg”,“UTF-8”) %>,这段话的意思是将中文转为UTF-8编码,则必须在jsp页面的这行代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
后加入一行代码:
<%@ page import="java.net.URLEncoder" %>
文件位置
步骤2
修改控制类中的文件,并增加对文件名进行编码的方法(本控制器是针对中文文件名来进行的编程),代码如下所示:
@RequestMapping("/download")
public ResponseEntity<byte[]> filedownload(HttpServletRequest request,@RequestParam("filename")String filename) throws IOException{
//指定要下载的文件路径
String path=request.getServletContext().getRealPath("/filedownload/");
//创建该文件对象
File file = new File(path+File.separator+filename);
//对文件名编码,防止中文文件乱码
filename=this.getFilename(request,filename);
//设置响应头
HttpHeaders headers=new HttpHeaders();
//通知浏览器以下载的方式打开文件
headers.setContentDispositionFormData("attachment", filename);
//定义以流的形式下载返回文件数据
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//使用Spring MVC框架的ResponseEntity对象封装返回下载数据
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.OK);
}
/**
* 根据浏览器的不同进行编码设置,返回编码后的文件名
*/
private String getFilename(HttpServletRequest request, String filename) throws IOException{
//IE不同版本User-Agent中出现的关键词
String[] IEBrowserKeyWords = {"MSIE","Trident","Edge"};
//获取请求头代理信息
String userAgent = request.getHeader("User-Agent");
for(String keyWord : IEBrowserKeyWords) {
if(userAgent.contains(keyWord)) {
//IE内核浏览器,统一为UTF-8
return URLEncoder.encode(filename,"UTF-8");
}
}
//其他浏览器统一为ISO-8859-1编码显示
return new String(filename.getBytes("UTF-8"),"ISO-8859-1");
}
若不是中文文件下载,则可以尝试这种方式(该方法为课本原本方法,本人并未尝试):
@RequestMapping("/download")
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
String filename) throws Exception{
// 指定要下载的文件所在路径
String path = request.getServletContext().getRealPath("/upload/");
// 创建该文件对象
File file = new File(path+File.separator+filename);
// 设置响应头
HttpHeaders headers = new HttpHeaders();
// 通知浏览器以下载的方式打开文件
headers.setContentDispositionFormData("attachment", filename);
// 定义以流的形式下载返回文件数据
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
// 使用Sring MVC框架的ResponseEntity对象封装返回下载数据
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
headers,HttpStatus.OK);
}
(希望这篇博客可以帮到你)