springMVC实现单文件和多文件上传

一、介绍
    spring 内建的multipart支持网络程序文件上传。我们可以通过配置MultipartResolver来启动上传支持。它定义在org.springframework.web.multipart包中。spring是通过使用Commons FileUpload插件来完成MultipartResolver的。

   默认情况下,spring不处理multipar的form信息,因为开发者默认会自己去处理这部分信息,当然我们可以随时打开这个支持。这样对于每一个请求,都会查看它是否包含multipart的信息,如果没有则按流程继续执行。如果发现有,就会交给已经被声明的MultipartResolver进行处理,然后我们就能像处理其他普通属性一样处理文件上传了。

二、使用MultipartResolver

<!--200*1024*1024即200M resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="209715200" />
		<property name="defaultEncoding" value="UTF-8" />
		<property name="resolveLazily" value="true" />
	</bean> 
当然,我们要把所需的jar包放到lib中, 就是commons-fileupload.jar.

三、处理一个文件上传的form
   当MultipartResolver处理完成以后,请求被处理成和普通请求一样。下面是页面文件。

单文件:

course_admin/file.jsp 文件


<body>
<div align="center">

<h1>上传附件</h1>
<form method="post" action="<%= request.getContextPath()%>/courses/doUpload" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit"/>
</form>
</div>
</body>

多文件:
course_admin/multifile.jsp  文件

<body>
<div align="center">
<h1>上传多个附件</h1>
<form method="post" action="<%= request.getContextPath()%>/courses/doUpload2" enctype="multipart/form-data">
<input type="file" name="file1"/>
<br/>
<input type="file" name="file2"/>
<input type="submit"/>
</form>

</div>
</body>

四,下一步是创建一个controller来处理文件上传。controller也和其他的一样,除了在我们的方法参数中使用MultipartHttpServletRequest或者MultipartFile。

        @Controller
	@RequestMapping("/courses")
	public class CourseController  {
            @RequestMapping(value="/upload",method=RequestMethod.GET)
	    public String showUploadPage(@RequestParam(value="muti",required = false ) Boolean multi){
	    	if(multi!=null&&multi){
	    		return "course_admin/multifile";
	    	}
	    	return "course_admin/file";
	    }
	    @RequestMapping(value="/doUpload",method=RequestMethod.POST)
	    public String doUploadFile(@RequestParam("file") MultipartFile file) throws IOException{
	    
	    	if(!file.isEmpty()){
	    	FileUtils.copyInputStreamToFile(file.getInputStream(),
	    			new File("d:\\test", System.currentTimeMillis()+ file.getOriginalFilename()));	
			
	    	}
	    	return "success";
	    }
	    @RequestMapping(value="/doUpload2",method=RequestMethod.POST)
	    public String doUploadFile2(MultipartHttpServletRequest multiRequest) throws IOException, Exception{
	    	Iterator<String> filesNames = multiRequest.getFileNames();
	    	while(filesNames.hasNext()){
	    		String fileName = filesNames.next();
	    		MultipartFile file = multiRequest.getFile(fileName);
	    		if(!file.isEmpty()){
	    			FileUtils.copyInputStreamToFile(file.getInputStream(), 
	    					new File("d:\\test", System.currentTimeMillis()+ file.getOriginalFilename()));
	    		}
	    	}
	    	return "success";
	    	
	    }
	}

这里用到FilesUtils 类    需要导入

commons-io-2.4.jar  链接:点击打开链接


这样,配置就好了,浏览器中输入 http://www.localhost:8080/springMVCTest/courses/upload


选择文件,后提交,跳转到/WEB-IN/success.jsp





浏览器中输入 http://www.localhost:8080/springMVCTest/courses/upload?muti=true


提交后在  D\\test文件中发现上传成功


注意点:

1, commons-fileupload-1.3.1.jar

       commons-io-2.4.jar     两个包必须导入

2,

还有  form中加入 enctype ="multipart/form-data"

3,在配置文件里一定要对multipart解析器的配置,否则会出现以下错误,调试了我一晚上。。。。

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: Failed to invoke handler method [public java.lang.String com.cn.main.CourseController.doUploadFile2(org.springframework.web.multipart.MultipartHttpServletRequest) throws java.io.IOException,java.lang.Exception]; nested exception is java.lang.IllegalStateException: Current request is not of type [org.springframework.web.multipart.MultipartHttpServletRequest]: org.apache.catalina.connector.RequestFacade@54fd9d07
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
	org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)




















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值