【踩坑日记】springboot MultipartFile上传,@Async异步执行时报错:java,io.FileNotFoundException

2023-09-21 16:58:28

项目场景:

springboot 项目中使用MultipartFile上传文件导入时,文件内容过大会导致页面等待时间较长,所以考虑使用上传文件时用@Async异步处理数据的方式来解决页面等待问题。


问题描述

给处理MultipartFile文件的方法添加@Async注解后,上传文件时出现异常,找不到临时文件

异常如下:

(org. springramework.web.multipart,MultipartFile,java.lang.Integer) throws java.io. IOExcept.onjava,io.FileNotFoundException: /tmp/tomcat,6802674863357158901,1070/work/Tomct/localhost/HHY/upload f5e77369 7db0 4bdd 8cf7 921ddb06e2b8 00000002.trp (No such file or directory)
ream(DiskFileItem.java:194at org.apachetomcat .util.http.fileupload.disk.DiskFileltem.getInputSat org.apache.catalina.core.ApplicationPart.getInputStream(ApplicatioPart.java:100)at org.springframework.web .multipart .support.StandardMultipartHttpSerTetRequestsStandardMultipartFile.getBytes(StandardMultipartHttpServletRequest .jva:245) ......

接口代码:

  @PostMapping("/importData")
  public Boolean importData(
      HttpServletResponse response,
      @RequestParam("file") MultipartFile file) {
    try {
      formatManagementService.importData(file);
      return true;
    } catch (IOException e) {
      e.printStackTrace();
    }
    return false;
  }

// 异步处理导入的文件内容
  @Async
  public Boolean importData(MultipartFile file)
      throws IOException {
// 文件内容处理逻辑
....

  }

原因分析:

首先:前端传递过来的文件,会存储到临时文件夹中,即上面报错的文件路径位置;但是如果方法是异步执行的时候,主线程结束,临时文件就会被清空,所以会报上面的异常:


解决方案:

所以这里我们如果要通过异步处理,就需要转换成输入流来操作,通过传参的方式将输入流传到异步方法内。在异步方法内使用完毕再释放输入流:

代码如下:

  @PostMapping("/importData")
  public Boolean importData(
      HttpServletResponse response,
      @RequestParam("file") MultipartFile file) {
    try {
      formatManagementService.importData(file.getInputStream());
      return true;
    } catch (IOException e) {
      e.printStackTrace();
    }
    return false;
  }

// 异步处理导入的文件内容
  @Async
  public Boolean importData(InputStream fileInputStream)
      throws IOException {

          try {
            // 文件内容处理逻辑
            ....
          } catch (Exception e) {
            log.error("导入异常", e);
          }finally{
            if (fileInputStream!=null){
              fileInputStream.close();
            }
          }

  }

总结:

@Async需要注意使用事项,例如像循环依赖调用的影响等问题;

提醒:输入流对象在异步方法使用完后记得关闭流,否则会一直占用内存资源,并且服务器本地的缓存文件也无法更改或删除

更多推荐

python进程和线程(05)

python进程和线程(05)文章目录python进程和线程(05)1python进程和线程1.1进程和线程概念1.2并行执行1.3核心使用语法_threading模块1.4多线程编程1.4.1案例单线程不能满足情况如下:1.4.2多线程1.4.2.1多线程创建语句1.4.2.2案例1.4.2多线程传参使用1.4.2.

物联网网关:连接设备与云端的桥梁

物联网网关作为连接设备与云端的桥梁,承担着采集数据、设备远程控制、协议转换、数据传输等重要任务。物联网网关是一种网络设备,它可以连接多个物联网设备,实现设备之间的数据传输和通信。物联网网关通常具有较高的网络带宽和处理能力,能够满足大量设备同时进行数据传输的需求。物联网网关需要具备以下特点:设备连接与管理:能够与各种物联

Thinger.io 支持多协议、插件化开源 IoT 物联网平台

Thinger.io是一个开源插件化物联网平台,提供了设备原型、扩展和设备连接管理所需的一切工具。我们的目标是使物联网的使用民主化,使其可供全世界使用,并简化大型物联网项目的开发。01Thinger.io功能特性Thinger.io物联网平台由前端Web控制台和后端物联网服务组成,功能架构如下图:连接设备:兼容Linu

Android:获取MAC < 安卓系统11 <= 获取UUID

1.核心代码主要的UseMac.javaimportandroid.annotation.SuppressLint;importandroid.content.Context;importandroid.net.ConnectivityManager;importandroid.net.NetworkInfo;impo

【PickerView案例08-国旗搭建界面加载数据 Objective-C预言】

一、来看我们第三个案例1.来看我们第三个关于PickerView的一个案例,首先呢,我要问大家一下,咱们这个是几组数据呢,这是一个pickerView,只不过,它显示的是什么,一个界面,前面两个案例,都是文字这个案例,开始有图片了,总结一下这三个案例:1)第一个案例:组与组之间,没有任何关系,2)第二个案例:组与组之间

Java学习day03:方法、break和continue关键字

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)Java学习day03:方法、break和continue关键字一、方法1.什么是方法程序中最小的执行单元2.为什么要有方法开发中出现大量重复代码或功能,循

油猴Safari浏览器辅助插件:Tampermonkey for Mac中文版

油猴脚本Tampermonkey是一款油猴Safari浏览器辅助插件,是一款适用于Safari用户的脚本管理,能够方便管理不同的脚本。虽然有些受支持的浏览器拥有原生的用户脚本支持,但tampermonkey油猴插件将在您的用户脚本管理方面提供更多的便利,它可以提供了诸如便捷脚本安装、自动更新检查、标签中的脚本运行状况速

公众环境关注如何提升企业ESG表现(2011-2022年)

参照陶云清(2023)的做法,本团队对来自“科学学与科学技术管理”《公众环境关注如何提升企业ESG表现?—基于外部压力与内部关注的双重视角》一文中的基准回归部分进行复刻。如何驱动企业在逐利过程中兼顾环境、社会和治理表现(ESG)成为高质量发展过程中不可回避的重大现实问题。基于此,利用2011-2022年A股上市公司ES

华为云Stack的学习(六)

七、华为云Stack计算服务介绍1.计算服务整体介绍2.弹性云服务器ECSECS(ElasticCloudServer),即弹性云服务器,是由vCPU、内存、磁盘等组成的,获取方便、弹性可扩展、按需使用的、虚拟的计算服务器。ECS只需要花费较低的成本,就可以像使用本地PC或物理服务器一样,在云上使用弹性服务器,在大大降

计算机网络之物理层

目录一、物理层概述二、数据通信的基础知识2.1数据通信系统的模型2.2关于信道的几个基本概念2.3信道的极限容量三、物理层下面的传输媒体3.1导引型传输媒体3.2非导引型传输媒体四、信道复用技术五、数字传输系统六、宽带接入技术一、物理层概述物理层规程:用于物理层的协议。物理层的主要任务:确定与传输媒体的接口有关的一下特

【计算机网络】网络编程接口 Socket API 解读(7)

Socket是网络协议栈暴露给编程人员的API,相比复杂的计算机网络协议,API对关键操作和配置数据进行了抽象,简化了程序编程。本文讲述的socket内容源自Linuxman。本文主要对各API进行详细介绍,从而更好的理解socket编程。sendsend()遵循POSIX.1-2008MSG_CONFIRM是Linu

热文推荐