SpringMVC中文件上传-multipartResolver

我们有时候文件上传时会用到这个功能,这是springMVC自带的功能

为什么使用:因为性能优越

我们从使用的案例来讲解如何使用

我们假设现在传入request请求这个请求包含了文件的内容

看代码

  /*
        * 操作添加图片
        * */
        CommonsMultipartFile shopImg=null;//spring自带
        CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver(
                request.getSession().getServletContext()
        );//解析request传来的文件的,通过本次会话的上下文获取相关文件上传的内容
        if (commonsMultipartResolver.isMultipart((request))) {//如果有上传的文件流
            MultipartHttpServletRequest multipartHttpServletRequest= (MultipartHttpServletRequest) request;//这样就能提取出request中的文件流了
            shopImg=(CommonsMultipartFile)multipartHttpServletRequest.getFile("shopImg");//(这个字符串"shopImg"是前端传来的),得到文件

第一步:

先了解这些类所在包的结构

我们找到这样两个包:

看了里面包的介绍

我们知道multipart.commons是multipart的实现。

看下multipart.commons的包描述

扫描二维码关注公众号,回复: 2967700 查看本文章

这个包的描述如下:处理文件上传的多部分解析框架。 

 那么我看了两个包中的类,multipart.common中的类的描述都是对mulipart包中的接口的实现,我们来看multipart的接口描述

我们根据代码的顺序来看

 CommonsMultipartFile   shopImg=null;//spring自带

我们看 CommonsMultipartFile  的接口:

翻译下接口描述就是:“multipart request中接收到的上传文件的表示形式”,也就是说当我们要用这个框架时,处理文件时就要将文件转为这种文件形式

第二步:

CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver(
                request.getSession().getServletContext()

我们还是看这个类的接口描述

意思是:一个策略接口,multipart文件上传分辨率按照RFC 1867。实现通常在应用程序上下文中和独立时都可用。 

rfc1867 (http://www.ietf.org/rfc/rfc1867.txt) 为 http 协议添加了这个上传文件的功能

还有一段要注意:

Spring dispatcherservlet不使用缺省解析器实现,因为应用程序可能选择解析其multipart请求本身。要定义实现,请在DispatcherServlet的应用程序上下文中创建一个id为“multipartResolver”的bean。这样的解析器应用于由DispatcherServlet处理的所有请求。

如果DispatcherServlet检测到一个multipart请求,它将通过配置的MultipartResolver解析它,并传递一个包装好的HttpServletRequest。然后,控制器可以将其给定的请求转换为MultipartHttpServletRequest接口,该接口允许访问任何multipart文件。注意,此转换仅在实际的multipart请求时才受支持。

上面这两段话理解下,就是如果我们要用这个框架首先在springMVC中配置id为“multipartResolver”的bean,然后每当有一个包含文件的request请求,我们就调用配置的MultipartResolver解析它,处理完后返回一个HttpServletRequest,然后,控制器可以将请求转换为MultipartHttpServletRequest,这个接口可以访问任何传入的multipart文件,也就是说转为这个形式我们就能读取其中的文件了

此时回到代码,我们用了带参数的构造方法。

这个构造方法的翻译并不能很好解释,但是我们看类的解释里提到了这个方法

 翻译里最后一句的意思是:将临时文件保存到servlet容器的临时目录中。需要由应用程序上下文或通过接受servlet上下文(独立使用)的构造函数进行初始化。

也就是说:当我们需要将文件保存在servlet容器的临时目录时,就传入这个servletContext,保存起来

看下一行

  if (commonsMultipartResolver.isMultipart((request))) {//如果有上传的文件流

看api

翻译:确定给定的请求是否包含Multipart内容。就是检查这个里面是否有文件

下一行

MultipartHttpServletRequest multipartHttpServletRequest= (MultipartHttpServletRequest) request;//这样就能提取出request中的文件流了

直接进行强转将HttpServletRequest变为MultipartHttpServletRequest类型。

我们看下MultipartHttpServletRequest类型。

描述:提供其他方法来处理servlet请求中的多部分内容,允许访问上传的文件。实现还需要覆盖用于参数访问的标准ServletRequest方法,使multipart参数可用。

也就是说可以用来处理上传的文件

下一句

shopImg=(CommonsMultipartFile)multipartHttpServletRequest.getFile("shopImg");//(这个字符串"shopImg"是前端传来的),得到文件

getFile是multipartHttpServletRequest的父接口的方法,我们看下api

getFile方法描述:返回此请求中上传文件的内容和描述,如果不存在则返回null。 

我们使用强转转为实现类,然后赋值给一开始定义的multipart文件。

猜你喜欢

转载自blog.csdn.net/Sunmeok/article/details/82185426
今日推荐