29 SpringMVC 上传文件未生成临时文件

2024-05-28 15:38

本文主要是介绍29 SpringMVC 上传文件未生成临时文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这个问题, 是这样的 : js ajax提交上传一个文件 到服务器1, 然后 服务器1需要吧文件 上传到服务器2, 差不多就是这个流程

js传递文件到服务器1之后, 通过 HttpClient 的MultipartEntityBuilder, post 服务器1生成的临时文件[file.getFile().getFileItem().getStoreLocation()], 发送到 服务器2, 然后 服务器2接收, 持久化 以及处理响应的业务逻辑
然后 这样的处理方式, 在我自己开发测试的时候, 发现 上传文件是能够上传成功, 然后 之后过了几天, 再来测试, 却发现 上传文件上传不成功了, 
然后 查询了一下后面 服务器1的日志, 发现 报的是一个 FNFE, 然后 瞅了一下该临时文件存储的地方, 妈的 居然刚上传的图片没有临时文件生成
然后 网上搜索了一下, 最后 网上搜索了一篇文章, 然后 配置了一下, 临时解决了这个问题, 然后 是准备 周末瞅瞅这块的代码
spring mvc做上传图片,文件小于10k就不生成临时文件了 : http://ask.csdn.net/questions/191012


然后 接下来是正题了, CommonsMultipartResolver 解析请求的流程, 

环境 : spring-* : 4.2.5 RELEASE, commons-* : 2.4


FileUploadBase. parseRequest


在这个 while 循环的过程中, 解析 http 请求的 multipart 部分的数据 


FileUploadBase. findNextItem


getParsedHeaders, 解析 multipart 元数据信息, 然后 构造FileItemStream返回[带出来一个InputStream, 以及一些需要的元数据]


然后 来到fac.createItem, 这里, 构造DiskFileItem[我们上面碰到的么有生成临时文件的问题, 马上就要出来了], 
这里的 item.openStream(), 拿到的是一个 从request.getInputStream() 中那数据, 以boundary结尾作为输入流结束的一个InputStream 
-------循环解析 boundary, 给定的文件的数据, 可以参见 FileItemIterator. hasNext, MultipartStream$ItemInputStream 
-------解析多个文件之间的分隔符 boundary, 这里是从 content-type 请求头中拿, 参见 FileUploadBase. getBoundary 部分代码
然后 fileItem.getOutputStream(), 拿到的是一个 如果给定的数据小于 sizeThresHold, 就直接存放在ByteArrayOutputStream[服务器内存], 如果超过了 sizeThresHold, 持久化到 repository[临时文件的名字, 可以参见 DiskFileItem. getTempFile]
-------这部分的内容, 可以参见 DiskFileItem. getOutputStream, 以及DeferredFileOutputStream
-------这里的 FileItemFactory. respository的默认值[默认是服务器的临时文件夹], 来自于 CommonsMultipartResolver.setServletContext, mvc的ApplicationContext容器 启动之后, 后置通知过来的
-------DiskFileItemFactory.sizeThresHold 的配置, 可以通过 CommonsMultipartResolver. setMaxInMemorySize 配置 
然后 解析玩所有的数据之后, 来到 CommonsMultipartResolver. parseFileItems, 将所有的 "文件" 分类
-------如果是 表单字段, 则获取对应的字符串, 所有的 filedName 相同归于一个字符数组, 需要记录 contentType
-------如果是 文件, 则封装 CommonsMultipartFile
然后 封装 DefaultMultipartHttpServletRequest, 之后返回request, 交给 DispatcherServlet, 走之后的分派逻辑


至此, 这个问题, 差不多 就这样了吧


哦, 对了 因为这个问题, 还抓了一些包, 好久没用过 wireshark 了, 今天 又用了用, 还是有一些收获的, 比如 如何抓本地访问的包
wireshark如何抓取本机包
https://www.cnblogs.com/lvdongjie/p/6110183.html

放一个 "包"





参考连接

http://ask.csdn.net/questions/191012

https://www.cnblogs.com/lvdongjie/p/6110183.html


这篇关于29 SpringMVC 上传文件未生成临时文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010987

相关文章

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完