实现方法一、将文件以流的形式响应到页面
Controller接口代码
@RequestMapping(value = "/download/file")
@ResponseBody
public ResponseEntity<byte[]> dowmFile(String fileName, HttpServletRequest request){
logger.info("====> dowmFile");
// 读取文件保存的根位置
String realPath = request.getSession().getServletContext().getRealPath("/upload");
File file = new File(realPath + "/" + fileName);
HttpHeaders header = new HttpHeaders();
// 设置Content-disposition=attachment(下载头)
header.setContentDispositionFormData("attachment", fileName);
ResponseEntity<byte[]> re = null;
try {
// 将文件转化为流
re = new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), header, HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
}
return re;
}
前台代码:
<a href="../download/file?fileName=20200608093047111325.zip">下载</a>
实现方法二、借助Servlet实现
Controller代码:
getServletContext方法我使用的是org.apache.logging.log4j.web包里的
包依赖:
<!--log start【2.1.0】-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--log end【2.1.0】-->
@RequestMapping(value = "/download/files", method = RequestMethod.GET)
@ResponseBody
public void addFiles(String fileName, HttpServletResponse response) throws IOException {
logger.info("====> dowmFiles");
//设置文件MIME类型,如:("multipart/form-data")
response.setContentType(getServletContext().getMimeType(fileName));
//设置Content-Disposition (设置文件下载头)
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
//读取目标文件,通过response将目标文件写到客户端
//获取目标文件的绝对路径
String fullFileName = getServletContext().getRealPath("/upload/" + fileName);
System.out.println(fullFileName);
//读取文件
InputStream in = new FileInputStream(fullFileName);
OutputStream out = response.getOutputStream();
//写文件
int len;
while ((len = in.read()) != -1) {
out.write(len);
}
in.close();
out.close();
}
前台代码:
<a href="../download/files?fileName=20200608093047111325.zip">下载</a>