Springboot_08文件上传解析

该博客详细介绍了Spring MVC中如何处理文件上传。首先,通过检查Content-Type判断请求是否为multipart类型,然后利用MultipartResolver解析器解析请求,将文件封装到MultiValueMap中。在实际操作中,可以通过指定参数名从MultiValueMap中获取MultipartFile对象,并使用FileCopyUtils复制到目标位置。整个过程涉及文件上传、MultipartHttpServletRequest及文件复制等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {
//进行判断,看我们的请求类型是否是我们以multipart开头
//return StringUtils.startsWithIgnoreCase(request.getContentType(), "multipart/");
		if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
			if (WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class) != null) {
				if (DispatcherType.REQUEST.equals(request.getDispatcherType())) {
					logger.trace("Request already resolved to MultipartHttpServletRequest, e.g. by MultipartFilter");
				}
			}
			else if (hasMultipartException(request)) {
				logger.debug("Multipart resolution previously failed for current request - " +
						"skipping re-resolution for undisturbed error rendering");
			}
			else {
				try {
				//进行解析并进行封装我们的request请求,StandardMultipartHttpServletRequest
					return this.multipartResolver.resolveMultipart(request);
				}
				catch (MultipartException ex) {
					if (request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) != null) {
						logger.debug("Multipart resolution failed for error dispatch", ex);
						// Keep processing error dispatch with regular request handle below
					}
					else {
						throw ex;
					}
				}
			}
		}
		// If not returned before: return original request.
		return request;
	}

使用下面的参数解析器进行解析
在这里插入图片描述

调用下面方法来得到文件
在这里插入图片描述

 //详细
 //其实底层就是将我们的请求文件一组一组的封装到了MultiValueMap<String, MultipartFile>当中,根据我们传入的key来获取值
	@Override
	public List<MultipartFile> getFiles(String name) {
	//到MultiValueMap<String, MultipartFile>中根据我们的key去获取(也就是我们的参数,起的名字)
		List<MultipartFile> multipartFiles = getMultipartFiles().get(name);
		if (multipartFiles != null) {
			return multipartFiles;
		}
		else {
			return Collections.emptyList();
		}
	}

最后再调用我们的FileCopyUtils类的copy方法进行复制到我们的参数中;

思路总结:
先判断我们的Content-Type 是否是以"Multipart开头的",
遍历参数解析器,找到RequestPortMethodArgumentResoulver参数解析器
我们请求中的文件都会保存在我们的MulitValueMap<String,Mulitpart>中,
会根据我们传入的参数名字为key进行寻找,找到我们的value,
最后使用工具类FileCopyUtils的copy方法进行复制到参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值