Springmvc对传统文件上传操作做了封装,使得对请求体中文件的解析过程,全部通过前端控制器交由文件解析器进行处理,而我们在编写程序的时候只需要在方法参数处声明参数名等于文件上传组件name的参数,即可接收到经过文件解析器解析后的文件,继而进行文件保存的操作
一、首先先看一下传统方式进行文件上传操作
1.首先要导入依赖,供解析文件使用
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2.表单的提交类型:
2.1请求方式必须为post
2.2form的enctype项需设置为multipart/form-data(默认为application/x-www-form-urlencoded)
<form action="user/fileUploadOld" method="post" enctype="multipart/form-data">
选择文件<input type="file" name="upload"><br/>
<input type="submit" value="上传">
</form>
3.控制器进行文件解析,保存
/**
* 传统方式上传文件
* @param request
* @throws Exception
*/
@RequestMapping("/fileUploadOld")
public void fileUpload(HttpServletRequest request) throws Exception{
request.getSession();
//获得项目下upload文件夹的绝对路径
String path = request.getSession().getServletContext().getRealPath("/upload/");
//判断该路径是否存在
File file = new File(path);
if(!file.exists()){
file.mkdir();//没有该文件夹就新建
}
//解析request中的文件项
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
List<FileItem> fileItems = servletFileUpload.parseRequest(request);
for (FileItem item : fileItems) {
//是否是上传文件的项
if(item.isFormField()){
//普通表单项
}else{
//上传文件项目
String fileName = item.getName();//上传时的文件名
item.write(new File(path+fileName));//写入硬盘
item.delete();//删除缓存
}
}
}
二、利用springmvc提供的文件解析器
过程:
文件通过表单提交后,首先经过前端控制器,前端控制器会把请求直接交给文件解析器进行处理,文件解析器会将request中的文件部分进行解析,封装为MultipartFile类型的对象。在controller中,我们只需要声明MultipartFile类型的形参,形参名称与要接受表单中的输入框的name相同,springmvc即可将对应的文件赋值到该参数。
实际就是文件解析器帮我们完成了文件解析的过程,原本我们需要对request中的对应文件进行解析,现在springmvc直接帮我们解析好了,直接接收来用即可。
大致流程图:
1.首先要把文解析器在springmvc的配置文件中配置给前端控制器:
<!--id必须要写multipartResolver,前端控制器默认调用-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1000000"></property><!--上传文件最大限制-->
</bean>
2.页面表单不变,name=multipartFile
<form action="user/fileUploadNew" method="post" enctype="multipart/form-data">
选择文件<input type="file" name="multipartFile"><br/>
<input type="submit" value="上传">
</form>
3.controller中使用MultipartFile接口类型进行接收,形参的名字要与表单中文件上传input的name相同(multipartFile)
/**
* 通过springmvc文件解析器方式上传文件
* @param request
* @throws Exception
*/
@RequestMapping("/fileUploadNew")
public void fileUploadNew(HttpServletRequest request,MultipartFile multipartFile) throws Exception{
//获得项目下upload文件夹的绝对路径
String path = request.getSession().getServletContext().getRealPath("/upload/");
//判断该路径是否存在
File file = new File(path);
if(!file.exists()){
file.mkdir();//没有该文件夹就新建
}
String originalFilename = multipartFile.getOriginalFilename();
multipartFile.transferTo(new File(path+originalFilename));
}