上篇使用传统servlet方式上传文件,还是比较复杂,而在SpringMVC中当然对此进行了封装,使我们不必再进行解析request中的信息,直接就可以上传
一、前置准备
两个依赖包
<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.0.1</version>
</dependency>
首先需要在springmvc-servlet.xml中配置解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<!-- 指定所上传文件的总大小不能超过2048KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="2048" />
</bean>
二、相关知识
1、 在传统上传方式中,我们知道request.getParameter(String)方法获取指定的表单字段字符内容,但文件上传表单已经不在是字符内容,而是字节内容,所以失效。
但是在SpringMVC封装好的解析器下,我们可以使用request.getParameter(String)方法获取指定的表单字段
2、在控制器中传入的参数MultipartFile file1必须与变淡名字一致,否则不起效
3、表单中一些限制,如提交方式等于上文传统一致
三、单文件上传
jsp页面
<form action="${pageContext.request.contextPath}/File2/load" method="post" enctype="multipart/form-data">
用户:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
上传文件:<input type="file" name="file1"><br/>
<input type="submit" value="提交">
</form>
控制器
@RequestMapping(value = "/load",method = RequestMethod.POST)
public String load(MultipartFile file1, HttpServletRequest request, String username) throws IOException {
String existPath = request.getServletContext().getRealPath("/WEB-INF/upload/");
System.out.println(username);
//可以得到表单数据
String password =request.getParameter("password");
System.out.println(password);
//得到文件名
String filename = file1.getOriginalFilename();
File file=new File(existPath);
//直接写入文件
file1.transferTo(new File(file,filename));
return "FileYes";
}
四、多文件上传
jsp页面
<h1>SpringMVC文件上传</h1>
<form action="${pageContext.request.contextPath}/File2/load" method="post" enctype="multipart/form-data">
用户:<input type="text" name="username"><br/>
密码:<input type="password" name="password"><br/>
上传文件:<input type="file" name="file1"><br/>
上传文件:<input type="file" name="file1"><br/>
<input type="submit" value="提交">
</form>
值了使用数组接收数据
@RequestMapping(value = "/load",method = RequestMethod.POST)
public String load(MultipartFile[] file1, HttpServletRequest request) throws IOException {
String existPath = request.getServletContext().getRealPath("/WEB-INF/upload/");
File filePaths=new File(existPath);
for(MultipartFile file:file1){
//得到文件名
String filename=file.getOriginalFilename();
File existPaths=new File(filePaths,filename);
//写入文件
file.transferTo(existPaths);
}
return "FileYes";
}