MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索

这篇具有很好参考价值的文章主要介绍了MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、描述异常背景:

因为需要分析数据,待处理excel文件的数据行数太大,手动太累,花半小时写了一个定制的数据入库工具,改成了通用的,整个项目中的万级别数据都在工具上分析,写SQL进行分析,但是遇到很疑惑的问题,文件上传结束收流时,tomcat的DisFileItem类的delete方法会自动调用,但是如果当前系统用户的权限不足,或是文件流在删除该临时文件之前未关闭都会导致删除失败,虽然接收流的业务操作都结束了,但是很是会报出糟心的UncheckedIOException:Cannot delete  tomcat默认的临时文件路径+_00000000.tmp异常(剧透一下:运行时未关闭输入流,JVM还在等待用户关闭,存在引用无法回收,所以手动跟着路径去删除你都删不掉,所以跟着源码找根源)。

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

2、查找异常原因(并不是所有的异常都是你显式的写出来的,特别是轮子使用不仔细的内部异常)

 以上请及其注意异常出现的根源:StandardServletMultipartResolver.java:134;

我们进去查看其源码得到

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

 也就是说我们的请求文件接收成功了吗,但是删除临时文件的操作出现问题了:

if (request.getFile(part.getName()) != null) {
                        part.delete();
   }

进入删除的代码下来:

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

注意这一句源码注释:

 删除部件的基础存储,包括删除任何关联的临时磁盘文件。尽管容器将自动删除此存储,但此方法可用于确保在较早的时间执行此操作,从而保留系统资源。
仅当对部件实例进行垃圾回收时,才需要容器删除关联的存储。Apache Tomcat 将在关联的请求完成处理后删除关联的存储。其他容器的行为可能不同。
抛出:
IOException – 如果在尝试删除部件时发生 I/O

那么我们进入到它的默认实现类的最终源码:

 MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

 到这里我们大致是知道问题出在这个临时文件的删除上了。

 但是为什么删除失败呢?只有可能是这行代码的问题:

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

 如果输出的文件就是有问题的null那一定是删除不掉的,让我们找找源码:

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

 这里一定是没有问题的,继续往下走:

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

 由此处的信息可以知道作为缓冲的临时文件区域的输出流未完成,还在保持开启状态,很大的可能是缓冲前的输入的流还没完全关闭(我们明确知道的是在代码里获取了输入的流但是没有对流进行关闭),亦或有可能原本文件上传就是null(当然不可能了兄弟)

3、结合2查找真正导致输出文件流在删除之前关闭的原因

我们注意到简单的接口代码是:

    @PostMapping("/upTopGoods")
    @ResponseBody
    public void upTopGoods(@RequestParam("fileName") MultipartFile fileName){
        if (Objects.nonNull(fileName)){
            excelUtil.setTopGoods(fileName);
        }
    }

这个流会在操作完成或输入流的字节被处理完之后没能主动关闭的话,很有可能出自于接口MultipartFile的性质需要我们自己关闭(所以才会有一次OOM异常,但是请注意一定不仅仅是这个导致的,BUG选手程序员要保持疑问)。

所以我们查看MultipartFile的源码试图找出问题所在:

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

 以上是MultipartFile的输入流方法注释。

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

以上处理完数据之后我们对输入的流进行了关闭,测试一下看看是否解决了问题:

MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

 MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索,tomcat,java

 通过结果来看是完全没有问题的了。

本次排查问题寻根原理过程结束,拜拜!文章来源地址https://www.toymoban.com/news/detail-615921.html

到了这里,关于MultipartFile类型接收上传文件报出的UncheckedIOException以及删除tomcat临时文件失败源码探索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于SpringWeb MultipartFile文件上传、下载功能

    在Web开发中,文件上传是一个常见的功能需求。Spring框架提供了MultipartFile接口,用于处理文件上传请求。MultipartFile可以代表一个多部分文件上传请求中的一个文件,提供了一系列方法用于获取文件的各种属性和内容,使得在后端处理文件上传变得十分方便。下面我们将介绍

    2024年04月17日
    浏览(31)
  • Postman本地测试上传MultipartFile文件接口

    在请求Body中选择form-data传输类型,填写后端file参数名称,并将参数设置为File类型,这时value输入框将变成文件选择框。 如果此时发送请求给后端,会返回报错request is not a multipart request. 我们还需要将数据传输类型Content-Type设置为multipart/form-data.

    2024年02月12日
    浏览(56)
  • Spring Mvc 文件上传(MultipartFile )—官方原版

    要启动Spring Boot MVC应用程序,首先需要一个启动器。在这个示例中,已经添加了spring-boot-starter thymelaf和spring-boot-starter web作为依赖项。要使用Servlet容器上传文件,您需要注册一个MultipartConfigElement类(在web.xml中为<multipart-config>)。多亏了Spring Boot,一切都可以自动配置!

    2024年02月14日
    浏览(38)
  • MultipartFile上传至服务器,文件名称中文乱码问题

    1.首先查看服务器是否设置为了zh_CN.UTF-8 输入命令:locale  不是则,进行查看服务器上是否有zh_CN.UTF-8 查看所有可以使用的字符编码集 输入命令:locale -a  如果没有可用的zh_CN.UTF-8 则进行安装: CentOS命令:yum install kde-l10n-Chinese -y  ubuntu命令:sudo apt-get install language-pack-zh-ha

    2024年02月10日
    浏览(40)
  • SpringBoot如何使用MultipartFile进行文件上传保存到服务器本地

    之前一直都是用的别人封装好的文件上传方法,这次想自己写一个特别简单的,文件上传方法,非常适合新手观看… 首先需要Springboot需要有Web依赖,就是下面这个依赖 依赖导完了,下面就直接是代码,大家看一下 到这里文件上传的解释都在代码里面,下面如果报文件过大的报错还需

    2024年02月13日
    浏览(64)
  • Spring Boot学习随笔- 文件上传和下载(在线打开、附件下载、MultipartFile)

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 文件上传是指将文件从客户端计算机传输到服务器的过程。 上传思路 前端的上传页面:提交方式必须为 post , enctype 属性必须为 multipart/form-data 开发后端的Controller 后端方法接收参数必须和前端标签的name名一致 upload.js

    2024年02月04日
    浏览(38)
  • java MultipartFile+vue+element 批量上传文件、图片,与普通数据同时提交保存才上传到后端

    文件上传项目可参考:点击预览 1.最简单也是最普遍的做法是form表单提交,其实前端提交到后端也是难以离开form表单提交, 一般有两种方式来处理文件、图片上传: 先上传,获取返回路径,再整个表单提交后端保存; 普通数据与文件图片同时提交后端,由后端处理 优点比

    2024年02月03日
    浏览(53)
  • Spring Cloud Feign MultipartFile文件上传踩坑之路(包含前端文件上传请求、后端文件保存到aliyun-oss文件服务器)

    文件上传组件用的是ant-design的a-upload组件,我的界面如下所示: 文件上传请求API: FileUtils.js 需要注意的只有FileUtils.js定义的uploadApi请求函数,其中 URL 为后端请求接口(“/imageConvert/upload”),文件上传方法必须定义为 POST ,在 headers 加入’Content-type’: ‘multipart/form-data’,后端

    2024年02月12日
    浏览(45)
  • SpringBoot文件上传同时,接收复杂参数

    目录 环境信息 问题描述 错误分析 解决方法 简单参数 总结         Spring Boot:2.0.8.RELEASE         Spring Boot内置的tomcat:tomcat-embed-core 8.5.37         收到文件上传的开发工作,要求能适配各种场景,并且各场景的请求参数不一样,因此接收的参数不能是固定的几个字段

    2024年02月09日
    浏览(43)
  • SpringBoot后端接收Axios上传的文件

    很多时候,我们项目开发的过程中,难免会遇到文件上传的需求 对于 SpringBoot 项目,我们该如何编写一个文件上传的接口呢? 这里我用的是 阿里云OSS 云服务器来作为上传文件的存储仓库,比起存储在电脑本地,云服务器更加便于管理、性能更好并且更加 安全 ,值得我们选

    2024年02月22日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包