#### 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" />