SpringBoot MultipartFile上传导入 使用异步@Async注解时,报错:java,io.FileNotFoundException

SpringBoot MultipartFile上传导入 使用异步@Async注解时,报错:java,io.FileNotFoundException

背景

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

问题描述

给处理MultipartFile文件的方法添加@Async注解后,上传文件时出现异常,报错:系统找不到文件位置。

java.io.IOException: java.io.FileNotFoundException(系统找不到指定的路径。)

原因分析

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

解决方案

需要通过异步处理,就需要转将文件换成输入流来操作,通过传参的方式将输入流传到异步方法内。在异步方法内使用完毕再释放输入流

 @PostMapping("/asyncImportData")
  public Boolean importData(@RequestParam("file") MultipartFile file) {
    try {
      xxxService.importData(file.getInputStream());
      return true;
    } catch (IOException e) {
      e.printStackTrace();
    }
    return false;
  }
 
// 异步处理导入的文件内容
  @Async // 默认的线程池
  @Async("xxxxx") // 自定义线程池
  public Boolean importData(InputStream fileInputStream)  throws IOException {
          try {
            // 文件内容处理逻辑
            ....
          } catch (Exception e) {
            log.error("导入异常", e);
          }finally{
            if (fileInputStream!=null){
              fileInputStream.close();
            }
          }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Harmon-x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值