1、web.xml配置(在<servlet></servlet>之间)
<servlet>
<multipart-config>
<!-- <location>/</location> -->
<max-file-size>5242880</max-file-size> <!--单个文件最大大小:5MB-->
<max-request-size>20971520</max-request-size> <!--所有文件最大大小:20MB-->
<file-size-threshold>0</file-size-threshold> <!-- 超过这个大小直接存硬盘,而不是内存 -->
</multipart-config>
</servlet>
相关可配置信息如下:
file-size-threshold:数字类型,当文件大小超过指定的大小后将写入到硬盘上。默认是0,表示所有大小的文件上传后都会作为一个临时文件写入到硬盘上。
location:指定上传文件存放的目录。当我们指定了location后,我们在调用Part的write(String fileName)方法把文件写入到硬盘的时候可以,文件名称可以不用带路径,但是如果fileName带了绝对路径,那将以fileName所带路径为准把文件写入磁盘。
max-file-size:数值类型,表示单个文件的最大大小。默认为-1,表示不限制。当有单个文件的大小超过了max-file-size指定的值时将抛出IllegalStateException异常。
max-request-size:数值类型,表示一次上传文件的最大大小。默认为-1,表示不限制。当上传时所有文件的大小超过了max-request-size时也将抛出IllegalStateException异常。
<bean class="org.springframework.web.multipart.support.StandardServletMultipartResolver" id="multipartResolver">
</bean>
3、form表单配置
form中间一定要有enctype="multipart/form-data",这个配置会让表单以二进制形式提交文件,而且提交的时候一定不能为空,否则会报错400。
4、controller
@RequestMapping("/insert")
public String insertPerson(Person person, HttpServletRequest request)throws Exception{
int inNum=personApplyService.insertPerson(person);
/*采用servlet3.0的part方式上传文件*/
if(inNum==1) {
Part part1 = request.getPart("idPhoto"); //获取name=="idPhoto"的文件
Part part2 = request.getPart("bankPhoto");
String path = request.getServletContext().getRealPath("/"); //获取webapp的根路径
String header1 = part1.getHeader("content-disposition"); //获取文件的头部信息
String header2 = part2.getHeader("content-disposition");
/*获取文件的名称*/
String fileName1 = header1.substring(header1.indexOf("filename=\"") + 10, header1.lastIndexOf("\""));
String fileName2 = header2.substring(header2.indexOf("filename=\"") + 10, header2.lastIndexOf("\""));
String savePath = path + File.separator + "upload";
File fileSaveDir = new File(savePath); //创建一个file的新实例,路径为savaPath
if (!fileSaveDir.exists()) {//如果这个新实例不存在,就新建一个路径file.mkdir()
fileSaveDir.mkdir();
}
part1.write(savePath + File.separator + fileName1); //把文件写入的路径之中
part2.write(savePath + File.separator + fileName2);//File.separator是文件夹之间的分隔符
//由于linux和windows的分隔符不同
return "redirect:/suc.jsp";//导致部署的时候会产生问题
} else {
return "redirect:/gonglu.html";
}
}
其他知识点:
//校验上传文件是否为图片格式
function pic1() {
var strs = new Array(); //定义一数组
var pic1= $("#pic1").val();
strs = pic1.split('.');
var suffix = strs [strs .length - 1];
if (suffix != 'jpg' && suffix != 'gif' && suffix != 'jpeg' && suffix != 'png') {
alert("你选择的不是图片,请选择图片!");
var obj = document.getElementById('pic1');
obj.outerHTML = obj.outerHTML; //这样清空,在IE8下也能执行成功
//obj.select(); document.selection.clear(); 好像这种方法也可以清空 input file 的value值,不过我没测试
}
}
参考文档:https://my.oschina.net/lenglingx/blog/607972
http://blog.csdn.net/clementad/article/details/49533189
https://my.oschina.net/u/1756290/blog/547666
http://www.cnblogs.com/Leo_wl/p/4393190.html
一个比较详细容易看懂的多文件上传:http://blog.csdn.net/estelle_belle/article/details/51751844(part部分讲解)