需求:对download文件夹下的文件下载
两个下载链接:
<a href="${pageContext.request.contextPath}/download/logo.png">下载logo.png</a>
<a href="${pageContext.request.contextPath}/download/框架.jpg">下载框架.jpg</a>
采用了rest风格传递参数
对应的控制器:
注意点:采用rest风格传参,会丢失文件格式,使用普通?传参不会,因此使用rest风格传参要在参数后面加上”:.+“
第一步:获取文件的路径,可以手动传入一个httpsession来获取getrealpath(),再拼接上文件名
第二步:将文件读入程序中,读入到一个byte数组中
第三步:设置相应头,以附件的形式打开(即下载)
@RequestMapping("/download/{filename:.+}")
public ResponseEntity download(@PathVariable String filename, HttpSession session) throws Exception {
System.out.println(filename);
//1.获取文件路径
String realPath = session.getServletContext().getRealPath("/download/"+filename);
System.out.println(realPath);
//2.将文件读入到程序中
InputStream io = new FileInputStream(realPath);
byte[] bytes = new byte[io.available()];
io.read(bytes);
//3.springmvc提供了直接设置相应头,可以让浏览器直接以附件的形式打开(下载)
//创建响应头
HttpHeaders httpHeaders = new HttpHeaders();
//设置中文文件名的编码
filename= URLEncoder.encode(filename,"UTF-8");
httpHeaders.add("Content-Disposition","attachment;filename"+filename);
//传入读取文件的byte数组、相应头、状态码
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK);
return responseEntity;
}