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/712254/

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

(0)

大家都在看

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