MultipartFile做文件上传报FileNotFoundException

笔者遇到的问题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 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 list = listener.getList();

......
}

主要是接受文件,然后保存,然后解析,

这里在单元测试的时候,如下 

    @Test
    public void  upload() throws Exception {
        long startDate = System.currentTimeMillis();
        Map 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文件上传异常之提示The temporary upload location xxx is not valid - 一灰灰Blog - 博客园原文: "一灰灰Blog之Spring系列教程文件上传异常原理分析" SpringBoot搭建的应用,一直工作得好好的,突然发现上传文件失败,提示 目录非法,实际查看目录,结果还真https://www.cnblogs.com/yihuihui/p/10372887.html

文件上传时,MultipartFile.transferTo() 方法报 FileNotFoundException - 星空流年 - 博客园Spring Upload File 报错FileNotFoundException 环境: Springboot 2.0.4 JDK1.8 内嵌 Apache Tomcat/8.5.32 https://www.cnblogs.com/cndarren/p/12558348.html

 

你可能感兴趣的:(springboot,springboot)