MultipartFile上传文件异步处理时的java.io.FileNotFoundException

参考:https://javajgs.com/archives/26157

1-1 需求

前端上传Word文档,后端将接收到的Word文档①上传到文件服务器②将Word转为Pdf。

1-2 方案

因为Word转Pdf的耗时较长,为了及时给到前端返回信息,在将文件上传到文件服务器后,异步将Word转为Pdf。

创建一个SpringBoot项目。

3-1 问题描述

以上是一个简单的演示,在实际的项目中,会 偶现如下异常。

意思是找不到某个临时文件。

3-2 问题复现

在UploadService类的51行添加如下代码,可保证每次上传文件操作都会出现3-1中的异常。

3-3 原因分析

1.后台用MultipartFile接收到前端传来的文件后,会在本地生成一个临时文件,以.tmp结尾;

2.MultipartFile对应的临时文件的生命周期是一个请求会话,会话结束,MultipartFile的临时文件会被自动清理;

3.因为将文件转为Pdf的方法是在请求主线程之外的另一个线程中执行的,所以不在请求会话的生命周期内。如果请求会话的主线程结束了(将请求结果返回给前端了),这个请求传来的MultipartFile的临时文件就会被清理掉,在将文件转Pdf的线程中就拿不到MultipartFile对应的临时文件,也就获取不到对应的输入流,故抛出FileNotFoundException。

主线程在用MultipartFile接收到前端传来文件后,立即将MultipartFile保存为本地文件。将文件转Pdf时,使用保存在本地的文件,转换完成后,删除本地文件。

1.可使用MultipartFile的transferTo方法将MultipargFile转为本地文件,但需要注意,transferTo方法被调用后,也会删除MultipartFile对应的临时文件;

2.在使用transferTo的时候可能会出现绝对路径和相对路径的问题;

3.鉴于1.2中transferTo方法的局限性,建议手动获取MultipartFile的输入流,然后写到本地文件中。可以使用Hutool的FileUtils.copyInputStreamToFile(final InputStream source, final File destination)方法;

4.本地文件使用完成后,务必删除本地文件,避免服务器硬盘被占满。

Original: https://www.cnblogs.com/certainTao/p/16591869.html
Author: certainTao
Title: MultipartFile上传文件异步处理时的java.io.FileNotFoundException

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585271/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 在线安装Docker

    安装 yum-utils 包yum install -y yum-utils 设置存储库# 官方地址(比较慢) yum-config-manager \ –add-repo \ …

    Linux 2023年6月7日
    080
  • 排序算法

    内部排序 这里先介绍一个概念,算法稳定性 算法稳定性 — 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]…

    Linux 2023年6月6日
    0129
  • 文件批量改名(有规律)

    1.如你的文件放在桌面名字为file的文件内,我要把这些文件批量名称改为page1.jpg,page2.jpg,page3.jpg………. 2….

    Linux 2023年6月13日
    083
  • Spring5新特性—Log4j2

    Spring5新特性—Log4j2 Spring5新特性—Log4j2 创建一个Maven项目,导入依赖 org.apache.logging.log4j log4j-core 2…

    Linux 2023年6月14日
    088
  • MySQL提权 通过UDF

    UDF是什么 命令执行 文本写入 Example: 远程写入 反弹Shell 提权 UDF是什么 参考:https://www.cnblogs.com/litlife/p/9030…

    Linux 2023年6月6日
    099
  • 在docker中使用主机串口通讯

    在进行软件docker化的过程时,很大的一个阻碍就是软件与各种外围硬件设备的交互,网口通信的设备能够很容易地接入容器,但是串口设备则要复杂一些。本文讨论在windows和linux…

    Linux 2023年6月6日
    0102
  • Redis相关监控参数【转】

    1 慢查询 默认情况下命令若是执行时间超过10ms就会被记录到日志,slowlog只会记录其命令执行的时间,不包含io往返操作,也不记录单由网络延迟引起的响应慢。如果想修改慢命令的…

    Linux 2023年5月28日
    070
  • 微信白名单获取

    公司在微信WIFI登录项目中,需要在BRAS设备上添加微信服务器的IP地址到白名单列表中,以实现用户连接热点后,能够使用微信中的功能(如:添加公众号),但不能使用其他应用进行上网操…

    Linux 2023年6月14日
    0104
  • 【XML】学习笔记第四章-schema

    Schema 概述 作用 与DTD相比Schema的优势 基础命名空间: 模式 引用方法 通过xsi:noNamespaceSchemaLocation引入 通过xsi:shema…

    Linux 2023年6月14日
    082
  • rsync实时同步

    环境说明 服务器类型 IP地址 应用 操作系统 源服务器 192.168.169.139 rsync inotify-tools 脚本 centos8 目标服务器 192.168….

    Linux 2023年6月13日
    0106
  • 利用卷积神经网络处理cifar图像分类

    这是一个图像分类的比赛CIFAR( CIFAR-10 – Object Recognition in Images ) 首先我们需要下载数据文件,地址: http://…

    Linux 2023年6月6日
    0114
  • GIT合并部分文件的CLI

    | 0.24分钟 | 399.2字符 | 1、引言&背景 2、解决方案 3、声明与参考资料 | SCscHero | 2022/5/2 PM10:16 | 系列 | 已完成…

    Linux 2023年6月13日
    081
  • 自定义 systemd service

    Red Hat Linux 自 7 版本后 采用systemd 形式取代原先 init ,用户可以参考 系统service 创建自己的service ,以便于日常统一管理,系统se…

    Linux 2023年6月6日
    0101
  • 性能瓶颈分析与调优

    对于性能测试,很多时候压力并不能完全到达服务端,在客户端、网络连接端都有可能被阻塞,或者压测的某些特征符合CC和DDoS的行为,触发了防护策略导致压测结果达不到预期。 以下是各节点…

    Linux 2023年6月8日
    094
  • redis缓存按条件查询,删除等等i_master_cell

    先用hash 存masterid中的全部i_master_cell key为master_id hash里面为key 为cell_id value为i_master_cell的各个…

    Linux 2023年5月28日
    079
  • JDK的环境变量

    jdk下载并配置下载jdk下图是自己资源管理器中jdk的安装路径,双击然后next就好,不需要改什么配置 手里没有安装包的,下载地址在这里 :https://www.oracle….

    Linux 2023年6月13日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球