现场还原,一下是下载大文件出现内存溢出的代码:
@RequestMapping(value = "/downLoadBackupFile")
public ResponseEntity<byte[]> downloadBackupFile(Integer id, HttpServletResponse response) throws Exception{
String path = eqm.findAddr(id);
File file = new File(path);
String fileName = file.getName();
byte[] body = null;
InputStream is = new FileInputStream(file);
body = new byte[is.available()]; // 报错显示该行出现内存溢出问题,new了一个非常大的byte数组
is.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attchement;filename=" + fileName);
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);
return entity;
}
应该修改为:
@RequestMapping(value = "/downLoadBackupFile", method = RequestMethod.GET)
public void downloadBackupFile(Integer id, HttpServletResponse response) throws Exception{
String path = eqm.findAddr(id);
File file = new File(path);
String fileName = file.getName();
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attchement;filename=" + fileName);
response.setHeader("Content-Length", file.length() + "");
InputStream bfis = new BufferedInputStream(new FileInputStream(file));
OutputStream ops = new BufferedOutputStream(response.getOutputStream());
byte[] body = new byte[1024];
int i = -1;
while ((i = bfis.read(body)) != -1){
ops.write(body, 0, i);
}
bfis.close();
ops.flush();
ops.close();
}