#### 1. 创建项目
创建`Maven Project`,`Group Id`为`cn.tedu.spring`,`Artifact Id`为`SRPINGMVC-03-UPLOAD`,`Packaging`选择`war`。
除了添加SpringMVC必要的依赖,另外还需要添加`commons-fileupload`依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
#### 2. 静态页面
在项目的`webapp`下创建`index.html`,该页面要求:
1. 表单`<form>`的`method`属性必须是`post`,因为上传的文件的数据量相对一般的请求参数来说,是非常大的数据,URL中放不下,另外,`enctype`属值的值必须是`multipart/form-data`:
<form action="" method="post" enctype="multipart/form-data">
2. 表单中必须有浏览文件的控件:
<input type="file" />
完整代码例如:
<form action="" method="post" enctype="multipart/form-data">
<p>请选择您要上传的文件:</p>
<p><input type="file" /></p>
<p><input type="submit" value="上传" /></p>
</form>
#### 3. 接收上传请求
首先,检查`spring-mvc.xml`中关于组件扫描的配置的根包,然后创建`cn.tedu.spring.UploadController`控制器类,添加`@Controller`注解,然后在控制器类中添加处理请求的方法:
@RequestMapping("upload.do")
public String upload() {
return null;
}
在处理请求的方法中,添加`MultipartFile`类型的参数,该参数就是客户端上传的文件封装得到的对象,在处理请求时,调用该参数对象的`void transferTo(File)`方法即可保存文件:
@Controller public class UploadController { @RequestMapping("upload.do") public String upload( @RequestParam("file") MultipartFile file) throws IllegalStateException, IOException { // 执行保存 File dest = new File("d:/1.jpg"); file.transferTo(dest); return null; } }
则静态页面的表单的`action`属性的值就必须是`upload.do`,浏览文件的控件的`name`属性值必须是`file`。
最后,在使用`MultipartFile`之前,还必须在`spring-mvc.xml`中配置`CommonsMultipartResolver`:
<!-- 配置上传时需要使用的MultipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />