一、原因,在springMvc处理请求参数中有file时,会将file临时存储到一个位置,等线程结束后,临时文件被删除。
但是如果使用了多线程(异步)处理请求,当这个请求分发到某个线程A后,主线程立即结束并将此临时文件删除,造成了A线程无法读取到这个文件,报出无法找到此文件。
二、解决方法,在下面代码中已经给出,我们在异步处理这个请求时,不要直接把文件传给下一级方法,而是把文件转化为java内存流对象后 ,再把流对象传给异步方法,这样就不会出现因为主线程删除文件导致的文件找不到错误了
//springmvc接收到前端请求,并去调用uploadToSendmail方法
@RequestMapping(value = "/batchPaichong")
public void batchPaichong(PaichongMenu paichongMenu) throws Exception{
String to = paichongMenu.getAddr();
String fileName = paichongMenu.getFile().getOriginalFilename();
InputStream ips = paichongMenu.getFile().getInputStream();
lawAnnSecondphaseService.uploadToSendmail(to,fileName,ips);
}
// uploadToSendmail方法使用异步处理
@Async
public void uploadToSendmail(String to, String fileName,InputStream ips){
System.out.println("开始发送"+Thread.currentThread().getName());
if(null!=ips){
List<ExcelPaichong> paiChongList = getObjectFromExcel(fileName,ips);
XSSFWorkbook workbook = getExcelFromObject(paiChongList);
sendEmail(workbook,to);
System.out.println("发送邮件成功"+Thread.currentThread().getName());
}
}