我们有时候文件上传时会用到这个功能,这是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的包描述
这个包的描述如下:处理文件上传的多部分解析框架。
那么我看了两个包中的类,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文件。