在SpringMVC上传文件变得更加方便,解析request中的文件项已经交给了SpringMVC去做,先来说一下SpringMVC上传文件的原理
通过上图来了解原理:
- 所有的请求都会先经过前端控制器,前端控制器会将请求分发给各个组件,文件上传请求也是一样,我们需要配置一个文件解析器,首先请求会经过文件解析器
- 文件解析器会对request请求做解析,具体就是对请求正文中的文件项做处理,然后将文件项返回给前端控制器
- 前端控制器会将文件项以参数绑定的形式转交给处理器进行处理,中间的过程就不说了,处理器通过拿到参数,就可以对文件项进行上传操作
- 需要注意的是,参数绑定的类型是spring实现的一个类——MultipartFile,而且参数名称需要和表单中的名称保持一致
下面看一下具体演示:
首先需要在前端页面写一个文件上传拿的表单
<form action="/mvc/file/testFile" enctype="multipart/form-data" method="post">
选择文件:<input type="file" name="upload"><br/>
<input type="submit" value="上传">
</form>
注意表单的类型,以及方法的类型
这时请求会首先经过前端控制器,前端控制器会将请求转发给文件解析器,所以我们需要配置文件解析器,在springmvc的配置文件中配置如下bean
<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
需要注意的是,springmvc框架本身去调用该文件解析器的id固定为multipartResolver,所以id是固定的,不可以变
这时,我们去配置映射Controller类以及映射方法
@Controller
@RequestMapping("/file")
public class FileController {
@RequestMapping("/testFile")
public String testFile(HttpServletRequest request, MultipartFile upload) throws Exception {
System.out.println("testFile 执行了 ...");
//使用fileupload组件完成文件上传
//上传的位置
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
if(!file.exists()) {
file.mkdirs();
}
//springmvc完成文件的解析过程,通过参数绑定已经到upload变量上
String fileName = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-", "");
fileName = uuid + "_" + fileName;
//完成文件上传
upload.transferTo(new File(path,fileName));
return "success";
}
}
- 通过注释发现,解析过程确实交给了spring
- 拿到文件的名称,是通过方法:getOriginalFilename
- 上传文件通过方法:transferTo