SpringMVC支持文件上传组件.commons-fileupload组件. commons-fileupload依赖commons-io组件.
1.配置步骤
导入包
2.配置文件的配置
<!--启动注解的默认配置-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 文件上传解释器 -->
<!-- 名字不能写错,一定是multipartResolver -->
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 默认内存的大小 b-->
<!-- <property name="maxInMemorySize" value="512000000" ></property> -->
<!-- 默认文件最大大小,b-->
<property name="maxUploadSize" value="20000000"></property>
</bean>
3.上传表单
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
文件上传<br/>
<!-- 要求
1.method必须是POST
2.内容类型:multipart/form-data
-->
<form action="${pageContext.request.contextPath }/upload.mvc" method="post" enctype="multipart/form-data">
<input name="file" type="file"> <input type="submit" value="上传">
</form>
</body>
</html>
4.后台代码
import java.io.File;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class FileUploadController {
/**
* 单文件上传执行方法
* @return
*/
@RequestMapping(value="upload")
public String upload(MultipartFile file){
System.out.println("-文件上传-");
//获得文件的原名
System.out.println(file.getOriginalFilename());
//创建一个文件
File destfile=new File("D:/dir/"+file.getOriginalFilename());
//将读取到的上传文件写入到destfile
try {
file.transferTo(destfile);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "/upload.jsp";
}
}
注意,因为核心控制器对上传解释器的名字是固定的. 是multipartResolver,所以我们配置上传解释器,名字必须是multipartResolver
public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, MultipartResolver.class);
表单代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
文件上传<br/>
<!-- 要求
1.method必须是POST
2.内容类型:multipart/form-data
3.多文件上传是使用数组,所以上传框的name要一样
-->
<form action="${pageContext.request.contextPath }/multi-upload.mvc" method="post" enctype="multipart/form-data">
<input name="files" type="file"> <br/>
<input name="files" type="file"> <br/>
<input name="files" type="file"> <br/>
<input type="submit" value="上传">
</form>
</body>
</html>
后台代码
/**
* 多文件文件上传执行方法
*
* @return
*/
@RequestMapping(value = "multi-upload")
public String multiUpload(MultipartFile[] files) {
System.out.println("-文件上传-");
// 多文件需要使用循环将所有的文件保存到本地
for (MultipartFile file : files) {
// 获得文件的原名
System.out.println(file.getOriginalFilename());
// 1.创建一个文件,如果file.getOriginalFilename()为空,destfile就是一个文件夹
File destfile = new File("D:/dir/" + file.getOriginalFilename());
// 2.将上传文件 保存到写入目标文件
//判断destfile是个文件在写入
if (destfile.isFile()) {
try {
file.transferTo(destfile);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return "/multi-upload.jsp";
}