springmvc 请求转换为MultipartFile的过程

news2025/7/18 4:40:06

前言:

        最近在研究文件上传的问题,所以就写下这个博客,让大家都知道从流转换为MutipartFile的过程,不然你就知道在方法中使用,而不知道是怎么样处理的,是不行的

从DiaspatherServlet说起:

        别问为啥,去了解tomcat和servlet的关系,我后面会 写这篇博客的

servlet的生命周期

init(); 只会调用一次

service();每次请求时调用

destroy();当要销毁Servlet时,调用

DispatherServlet的类图, 实现Serlvet接口

init()方法跟踪:  初始化 文件解析器的组件-我们在spring中注册的bean

 1.最终会调用到springmvc的jar包中的HttpSerlvetBean的init()方法中:

跟踪 initServletBean();方法

 跟踪  initWebApplicationContext()方法,里面会调用

onRefresh(wac);

onRefresh(wac); 由DispathcerServlet实现

 

initStrategies(ApplicationContext context)方法
initMultipartResolver(context); 会初始化文件解析器组件

 从spring中获取MultipartResolver类型的Bean - 也就是我们注册的文件解析的对象

 组件初始化完成之后,当有请求的时候,就可以去解析了

service方法跟踪, 组件解析请求中的文件数据

跟踪最后会调用到 FramewordServlet的processRequest方法中:

processRequest方法会调用 

doService(request, response);方法

调用到DiapatherSerlvet的doService实现中,最终会调用到

doDispatch(request, response);

processedRequest = checkMultipart(request);

this.multipartResolver != null && this.multipartResolver.isMultipart(request)

        第一个判断: 如果我们没有在spring中注册文件解析器,那么this.multipartResolver就为空;下面的判断就不会执行,直接返回传过来的request对象

         第二个判断:会调用isMultipart,判断请求是否是文件类型,这里我在spring中注册的是第一个,后续都是使用的是该bean里面的方法,不在赘述

 如果是文件上传的话,请求头中的  Content-Type:multipart/form-data; 

 两个判断都OK,就要进行处理 了

return this.multipartResolver.resolveMultipart(request);

 resolveMultipart方法
 
 parseRequest(request); 查看是怎么处理请求中的文件的

List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);

 这个就不用说的,调用上传组件解析我们的请求里面的文件,为啥这里是list呢,可能表单中有多个项:普通的输入性\上传的文件项  。每一个File Item对应表单中每一个输入项。文件上传HTTP传过来的数据是比较特殊的(MIME协议),数据格式是会进行拼接的,所以要使用上传组件进行分割。

parseFileItems方法
MultiValueMap<String, MultipartFile> multipartFiles = new LinkedMultiValueMap<>();

把得到的文件保存到 multipartFiles 中

return new MultipartParsingResult(multipartFiles, multipartParameters, multipartParameterContentTypes); 

把解析出来的文件列表保存到对象的属性中

最后回到

 resolveMultipart方法

把解析的

MultipartParsingResult对象 , 设置到DefaultMultipartHttpServletRequest的属性中,返回

附上DefaultMultipartHttpServletRequest类图

调用查看

调用方法,查看请求:里面的request确实是 DefaultMultipartHttpServletRequest,multipaerFiles属性中就是上传的文件流信息

浏览器发送的HTTP请求中的数据:

 请求体中的 数据格式如下,所以为啥要用上传组件帮我们进行分割、解析;

附上,自己理解的流程图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM内存结构简介

一、java代码编译执行过程 1.源码编译&#xff1a;通过Java源码编译器将Java代码编译成JVM字节码&#xff08;.class文件&#xff09; 2.类加载&#xff1a;通过ClassLoader及其子类来完成JVM的类加载 3.类执行&#xff1a;字节码被装入内存&#xff0c;进入JVM虚拟机&#xff…

Linux 计算机网络从零到一开始构建 必看

Linux 计算机网络从零到一开始构建 在整个互联网中&#xff0c;计算之间的沟可能通需要跨越千山万水&#xff0c;层层加密解码。当前我们就来尝试粗浅剖析一下整个计算机网络的形成。 形成与起源 从现在回头看之前的网络形成过程&#xff0c;其实对应的就是我们的网络多层架…

为了让自己心情愉悦,我用python把美妞得图片制成了GIF设置桌面

前言 大家早好、午好、晚好吖 ❤ ~ 要想生活过的去&#xff0c;每天美女必然少不了~ 每天看美女&#xff0c;只为了愉悦心情&#xff0c;心情好了&#xff0c;才长寿。 于是怀揣着愉悦心情的想法&#xff0c;我开始制作GIF动图生成器 这个小工具制作的目的是为了将多张图片组…

舵机的控制

舵机的信号线是做为输入线就是接收PWM信号&#xff08;定时器产生&#xff09;。 一般PWM的周期是20ms,那么对应的频率是50hz。那么改变不同的占空比就可以控制转动的角度。 其中占空比从0.5-2.5ms&#xff08;如果占空比大于2.5ms也只会在最大角度。&#xff09;&#xff0c;相…

Node.js+MySQL开发的B2C商城系统源码+数据库(微信小程序端+服务端),界面高仿网易严选商城

下载地址&#xff1a;Node.jsMySQL开发的B2C商城系统源码数据库&#xff08;微信小程序端服务端&#xff09; NideShop商城&#xff08;微信小程序端&#xff09; 界面高仿网易严选商城(主要是2016年wap版)测试数据采集自网易严选商城功能和数据库参考ecshop服务端api基于&am…

php学习笔记-代码基本语法-day01

php代码基本语法 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即“超文本预处理器”&#xff0c;是在服务器端执行的脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言&#xff0c;吸纳Java和Perl多个语言的特色发展出自己的特色语法&…

一些微信使用小技巧分享

技巧一&#xff1a;检测僵尸粉 微信好友过多&#xff0c;我们可以通过创建群聊来检测好友。点击右上角图标&#xff0c;选择【发起群聊】&#xff0c;勾选需要检测的好友&#xff0c;点击【完成】。能进群的都是朋友关系&#xff0c;不能进群的会删或者拉黑你。不过需要注意的是…

VS2022点云库PCL1.12配置过程中遇到的一些奇葩问题

最近处于换工作的间歇期&#xff0c;原来配置的电脑交公了&#xff0c;各种程序数据都做了搬家。对这些程序重新配置&#xff0c;可以说是一地鸡毛。系统对不上&#xff0c;各个开源库版本一团乱麻&#xff0c;尤其是配置PCL库的时候&#xff0c;遇到了各种奇奇怪怪的问题&…

二十八、Docker (4)

&#x1f33b;&#x1f33b; 目录一、Dockerfile入门1.1 Dockerfile 常用命令1.2 Dockerfile 搭建 jdk 环境1.3 Dockerfile 搭建 tomcat 环境镜像1.4 Dockerfile 创建微服务 java 镜像二、使用Nexus搭建Docker镜像私有仓库2.1 安装 Nexus2.2 访问配置 Nexus2.3 配置 Docker 服务…

自动驾驶助力智慧港口建设,景联文科技提供数据标注服务

“在无人集卡出现以前&#xff0c;岸桥式起重机需要把停靠在岸边的船舶上数百个集装箱全部吊起&#xff0c;放到一旁的集装箱卡车上&#xff0c;运向堆场&#xff0c;等待集装箱卸货后再进行下一次往返工作。为保证工作效率&#xff0c;需要上百位司机驾驶着集卡在港口中来回往…

拉伯证券|磷酸铁锂电池在储能市场的应用有哪些?

时隔四个月&#xff0c;中国有色金属工业协会硅业分会重启硅料报价。本周&#xff0c;单晶复投料成交均价为17.82万元/吨&#xff0c;单晶细密料成交均价为17.62万元/吨。综合其他组织报价数据&#xff0c;硅料已全线跌破20万元/吨&#xff0c;作为对比&#xff0c;上一年10月底…

Java入门知识以及细节(1.3w字笔记)

欢迎来到我的主页&#xff1a;【一只认真写代码的程序猿】 本篇文章收录于专栏【Java入门学习】 如果这篇文章对你有帮助&#xff0c;希望点赞收藏加关注啦~ 目录 Java和C的区别 Java中的运算 Math.random()函数 跳出多重循环的两种break方法 数组中的使用以及Java中的…

windows下图像标注软件Labelme安装及使用教程

文章目录一.Labelme简介二.安装labelme三.使用labelme进行图像标注一.Labelme简介 LabelMe 是一个用于在线图像标注的Javascript标注工具。与传统图像标注工具相比&#xff0c;其优势在于我们可以在任意地方使用该工具。此外&#xff0c;它也可以帮助我们标注图像&#xff0c;…

TCP 三次握手 四次挥手

请描述TCP三次握手和四次挥手&#xff0c;这是非常常考的一道面试题。 大家不要去追求过多的细节&#xff0c;你如果是搜一些文章或者答案的话&#xff0c;它会给你描述的很细。 然后我/你看到会很懵&#xff0c;因为这里面如果讲细了的话&#xff0c;需要很多这种网络请求的相…

Go语言基础2

一、注释 单行注释 // 我是单行注释多行注释 /* 我是多行注释 我是多行注释 我是多行注释 */二、变量 1. var name type (声明变量时将变量的类型放在变量的名称之后) var&#xff0c;声明变量的关键字name&#xff0c;变量的名字type&#xff0c;变量的类型 eg:单个定义…

FFMPEG完美入门资料---003---FFmpeg 架构

3.1 FFmpeg 文件结构 libavformat 主要存放 ffmpeg 支持的 各种编解码器 的实现及 ffmpeg 编解码 功能相关的数 文件简要说明allcodecs.c简单的注册类函数avcodec.h编解码相关结构体定义和函数原型声明dsputil.c限幅数组初始化dsputil.h限幅数组声明imgconvert.c颜色空间转换相…

剑指offer(C++)-JZ63:买卖股票的最好时机(一)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 假设你有一个数组prices&#xff0c;长度为n&#xff0c;其中prices[i]是股票在第i天的价格&#xff0c;请…

FreeMen正式上线,让工作更自由

“让工作更自由”&#xff0c;开屏页上六个大字宣告着FreeMen正式上线&#xff0c;全新的FreeMen APP也正式登录各大手机应用市场。作为一款专注IT技术者圈子的APP&#xff0c;其上线标志着助力程序员职业道路上向前迈进一大步。 FreeMen相关负责人表示&#xff0c;基本上10个职…

基于java+Springboot操作系统教学交流平台详细设计实现

基于javaSpringboot操作系统教学交流平台详细设计实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

【C语言】使用指针时出现的各种错误总结以及处理方法

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、什么是野指针二、野指针出现…