笔者遇到的问题RT,
当用postman测试的时候,遇到
报java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.273391201583741210.8080/work/Tomcat/localhost/ROOT/tmp/source/IMG_20160129_132623
这种错误。
因为当初是通过单元测试的,但是用postman测试接口的时候出现的问题,所以百思不得其解,查询百度后,在和同事讨论后,并且debug后,发现了问题所在。
首先看下笔者的代码
public void upload(Map<String, Object> paramMap, MultipartFile file, String visitUrlPrix) throws Exception {
checkParams(paramMap);
//生成文件夹并保存文件
String bigExcelUrl = ExcelSplitUtils.mkdirAndSaveBigExcel(file, companyId);
//解析大文件
CompanyEmployeeListener listener = new CompanyEmployeeListener(batchCount, Boolean.TRUE);
EasyExcel.read( file.getInputStream(), CompanyEmployee.class, listener).sheet().headRowNumber(2).autoTrim(true).doRead();
List<CompanyEmployee> list = listener.getList();
......
}
主要是接受文件,然后保存,然后解析,
这里在单元测试的时候,如下
@Test
public void upload() throws Exception {
long startDate = System.currentTimeMillis();
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put(CompanyConstant.COMPANY_ID,3);
File file = new File("D://companyInfo.xlsx");
FileInputStream fileInputStream = new FileInputStream(file);
MultipartFile multipartFile = new MockMultipartFile("copy" + file.getName(), file.getName(), "text/plain", fileInputStream);
uploadCompanyInfoService.upload(paramMap,multipartFile,"http://12.10.2.11:8760/dgddd/test");
log.info("end");
log.info("2000个数据花费时间:{}秒",(System.currentTimeMillis()-startDate)/1000);
}
再上述代码的情况下下,使用当前的单元测试是没问题的。
当时当通过controller接口,的时候,为什么会出现这个问题呢,核心是文件找不到,
临时文件找不到,debug之后,发现在执行了mkdirAndSaveBigExcel这个方法后,临时文件就消失了,因为文件流保存后,系统临时生成的文件就自动删除了,所以网上好多说修改lcation的,对这里的情况不适用。
所以需要修改代码为:
String bigExcelUrl = ExcelSplitUtils.mkdirAndSaveBigExcel(file, companyId);
saveBigExcelUrl(companyId, bigExcelUrl);
//解析大文件
File localFile = new File(bigExcelUrl);
CompanyEmployeeListener listener = new CompanyEmployeeListener(batchCount, Boolean.TRUE);
EasyExcel.read(new FileInputStream(localFile), CompanyEmployee.class, listener).sheet().headRowNumber(2).autoTrim(true).doRead();
这里后续方法不再使用file ,需要重新new一个file: File localFile = new File(bigExcelUrl);
使用这个。
总结:通过 controller接口传入得文件,在临时文件本地化后,就会删除,不能在后续代码中使用,但是单元测试不是这样的。
参考博客:
使用MultipartFile做文件上传报FileNotFoundException问题总结_fan330660的博客-CSDN博客--------------------------------------使用MultipartFile做文件上传报FileNotFoundException问题总结--------------------------------------public String upload(@RequestParam("file") MultipartFile multipartFile)问题:使用sp...
https://blog.csdn.net/fan330660/article/details/80606122解决使用Spring Boot、Multipartfile上传文件路径错误问题_daniel7443的博客-CSDN博客彻底跟路径错误say拜拜!题图:from Google1.问题描述关键字: SpringMVC 4.2.4 、 Spring Boot 1.3.1 、Servlet 3.0 、文件上传报错信息: java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.273391201583741210.8080/
https://blog.csdn.net/daniel7443/article/details/51620308
SpringBoot文件上传与临时文件消失问题解析
本文详细记录了在使用Postman测试SpringBoot接口时遇到的文件上传异常,具体表现为IOException:FileNotFoundException。问题根源在于文件保存后,临时文件被自动删除。解决方案是保存文件URL并在后续操作中使用新的File对象。单元测试未出现问题,但在Controller中调用接口时出现问题,通过debug找到了问题关键在于文件的持久化处理。
https://www.cnblogs.com/yihuihui/p/10372887.html
3200

被折叠的 条评论
为什么被折叠?



