一个简单的上传excel操作,只不过是异步解析,却一直报错:
/tmp/tomcat.7249967840843892717.80/work/Tomcat/localhost/ROOT/upload_acc8f0ff_e428_4675_8228_7d22d855d356_00000008.tmp (No such file or directory)
检查后发现写法并没有错误,该有的注解一个不少,但是上传到服务器就是找不到文件,在file.getInputStream()
时报错
最后发现是异步
导致的
- 后台用MultipartFile接收到前端传来的文件后,会在本地生成一个临时文件,以.tmp结尾;
- MultipartFile对应的临时文件的生命周期是一个请求会话,会话结束,MultipartFile的临时文件会被自动清理;
- 所以获取文件流不能在异步方法里,此时文件已经被清理
解决方法:在主流程中将MultipartFile
转为一个临时存在的文件进行异步操作,操作完成后删除该文件。
service
@Overridepublic void importFile(MultipartFile file) {// MultipartFile对应的临时文件的生命周期是一个请求会话,会话结束,MultipartFile的临时文件会被自动清理;// 异步导入需生成一个一直存在的临时文件,最后删除try {File excelFile = FileUtils.multipartFileToFile(file);lssVipInfoServiceAsync.analyzeFile(excelFile, lssVipImportFileBo.getId(), UserInfoContext.getUserInfo().getUsername());} catch (Exception e) {throw new RuntimeException("系统解析Excel文件出错");}}