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部分讲解)