上传文件
互联网中,上传图片,头像,证件,文本等都十分常见,这就涉及到了上传功能。Spring MVC为上传提供了良好的支持。通过MultipartResolver(Multipart)处理,对于MultipartResolver而言,它只是一个接口。
MultipartResolver(接口):
- CommonsMultipartResolver(实现类):第三方包,可以在所有Spring版本使用
- StandardServletMultipartResolver(实现类):Spring3.1版本后的产物,依赖servlet3.0或更高。
1. Spring MVC 文件上传基本步骤(下面是xml方式,注解也可以。)
- 添加文件上传相关依赖(jar包:commons-fileupload)
- 配置对上传文件对象的解析(spring的核心配置文件)
- 编写文件上传表单(请求方式为post,enctype必须为multipart/form-data)
- 编写对应的控制层对象处理文件上传(通过mutilpartFile参数接收文件)
2.Spring MVC文件上传依赖
添加文件上传时需要的依赖(pom.xml)
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
3. 定义文件上传的视图解析
在spring的核心配置文件中添加对象解析
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置文件编码处理 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 配置文件大小限制 -->
<property name="maxUploadSize" value="4096000000"/>
<!-- 配置内存缓冲区大小 -->
<property name="maxInMemorySize" value="1024000"/>
</bean>
说明:配置对象解析时,bean的id一定要指定,而且官方规定必须为multipartResolver
4. 定义文件上传的控制层对象UploadController
@RequestMapping("/upload/")
@Controller
public class UploadController {
@RequestMapping("uploadUI")
public String uploadUI(){
return "upload";
}
@RequestMapping("doUpload")
public ModelAndView doUpload(MultipartFile upfile) throws IOException{
//获取文件名以及文件大小,检测是否获得文件相关数据
String fileName=upfile.getOriginalFilename();
long size=upfile.getSize();
System.out.println(fileName+"/"+size);
//构建文件目标对象,这个对象对应的文件路径必须是存在的或者通过file对象自己创建
File dest=new File("D:/SSMWORK/"+fileName);
//transferto实现文件上传
upfile.transferTo(dest);
//封装数据返回
ModelAndView mv=new ModelAndView("upload");
mv.addObject("msg", "upload ok");
return mv;
}
}
说明:在控制层方法接收请求中file类型的数据时需要借助MultipartFile 类型的参数对象,其参数名要求与表单中type为file的参数名相同。
5. 定义文件上传页面
在WEB-INF/pages目录下创建一个upload.jsp,然后创建上传表单
<body>
<h1>文件上传</h1>
<h1>${msg}</h1>
<form action="doUpload.do"
method="post"
enctype="multipart/form-data">
<input type="file" name="upfile"/>
<br/>
<input type="submit" value="upload">
</form>
</body>
说明:定义表单时,提交方式必须为post,enctype必须为multipart/form-data