基于此篇文章中的一些没有注释的相关问题,今天进行SpringMVC的文件下载的更新:
新方法:
1.控制层,新建一个方法,返回值类型为ResponseEntity<byte[]>的方法,并在其函数的后面添加对应的后台需要处理的参数,比如可以传递FIleName
/**
* 文件下载
*
* @param id
* @return
*/
@GetMapping("/download/")
public ResponseEntity<byte[]> download(@PathVariable("id") String id) throws IOException {
File file = xxxService.buildXlsFileById(id);
return ResponseUtils.buildResponseEntity(file);
}
2. 编写service返回File文件对象,从Service层中查询数据库操作,并查询文件真正的路径位置,然后返回File对象
public File buildXlsById(String id){
//do something to find this file
File file=new File("1.txt");
return file;
}
3. 编写ResponseUtils中的相关方法
/**
* 构建下载类
* @param file
* @return
* @throws IOException
*/
public static ResponseEntity<byte[]> buildResponseEntity(File file) throws IOException {
byte[] body = null;
//获取文件
InputStream is = new FileInputStream(file);
body = new byte[is.available()];
is.read(body);
HttpHeaders headers = new HttpHeaders();
//设置文件类型
headers.add("Content-Disposition", "attchement;filename=" + file.getName());
//设置Http状态码
HttpStatus statusCode = HttpStatus.OK;
//返回数据
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);
return entity;
}
4.编写相对应得URL即可
老方法
/**
* 文件下载
* @Description:
* @param fileName
* @param request
* @param response
* @return
*/
@RequestMapping("/download")
public String downloadFile(@RequestParam("fileName") String fileName,
HttpServletRequest request, HttpServletResponse response) {
if (fileName != null) {
String realPath = request.getServletContext().getRealPath(
"WEB-INF/File/");
File file = new File(realPath, fileName);
if (file.exists()) {
response.setContentType("application/force-download");// 设置强制下载不打开
response.addHeader("Content-Disposition",
"attachment;fileName=" + fileName);// 设置文件名
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
return null;
}