spring mvc实现文件上传并携带其他参数的示例
这是主要使用到的jar文件是:springmvc+apachecommon-fileuplad
第一步:web.xml文件。【重点是springmvc的拦截器和相关监听器】
<?xmlversion="1.0"encoding="UTF-8"?> <web-appversion="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <!--Spring和mybatis的配置文件--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mybatis.xml</param-value> </context-param> <!--编码过滤器--> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--Spring监听器--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--防止Spring内存溢出监听器--> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <!--SpringMVCservlet--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!--此处可以可以配置成*.do,对应struts的后缀习惯--> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> </web-app>
第二步:spring-mvc配置文件【重点:springmvc视图模式,springmvc文件上传限定参数,springmvc资源拦截管理和其他】
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <!--自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器--> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <context:annotation-config/> <context:component-scanbase-package="com"/> <!--避免IE执行AJAX时,返回JSON出现下载文件--> <beanid="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <propertyname="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <!--启动SpringMVC的注解功能,完成请求和注解POJO的映射--> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <propertyname="messageConverters"> <list> <refbean="mappingJacksonHttpMessageConverter"/><!--JSON转换器--> </list> </property> </bean> <!--定义跳转的文件的前后缀,视图模式配置--> <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个可用的url地址--> <propertyname="prefix"value="/backstage/jsp/"/> <propertyname="suffix"value=".jsp"/> </bean> <!--配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包--> <beanid="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--默认编码--> <propertyname="defaultEncoding"value="utf-8"/> <!--文件大小最大值--> <propertyname="maxUploadSize"value="10485760000"/> <!--内存中的最大值--> <propertyname="maxInMemorySize"value="40960"/> </bean> <!--声明DispatcherServlet不要拦截下面声明的目录--> <mvc:resourceslocation="/js/"mapping="/js/**"/> <mvc:resourceslocation="/images/"mapping="/images/**"/> <mvc:resourceslocation="/css/"mapping="/css/**"/> <mvc:resourceslocation="/common/"mapping="/common/**"/> </beans>
第三步:jsp页面
<%@pagelanguage="java"pageEncoding="UTF-8"%> <formaction="<%=request.getContextPath()%>/users/add"method="POST"enctype="multipart/form-data"> username:<inputtype="text"name="username"/><br/> nickname:<inputtype="text"name="nickname"/><br/> password:<inputtype="password"name="password"/><br/> yourmail:<inputtype="text"name="email"/><br/> yourfile:<inputtype="file"name="myfiles"/><br/> <inputtype="submit"value="添加新用户"/> </form>
第四步:springmvc控制器代码
packagecom.wlsq.controller; importjava.io.File; importjava.io.IOException; importjava.util.HashMap; importjava.util.List; importjava.util.Map; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importorg.apache.commons.io.FileUtils; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.stereotype.Controller; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestMethod; importorg.springframework.web.bind.annotation.RequestParam; importorg.springframework.web.multipart.MultipartFile; importorg.springframework.web.servlet.ModelAndView; importcom.wlsq.model.News; importcom.wlsq.service.IUserMapperService; importcom.wlsq.util.Pagination; @Controller @RequestMapping(value="/users") publicclassUserController{ @Autowired privateIUserMapperServiceuserService; @RequestMapping(value="/userAll") publicModelAndViewsearchNews(HttpServletRequestrequest,HttpServletResponseresponse){ ModelAndViewmv=null; try{ mv=newModelAndView(); intpageSize=Integer .parseInt(request.getParameter("pageSize")==null?"10" :request.getParameter("pageSize")); intpageNum=Integer .parseInt(request.getParameter("pageNum")==null?"1" :request.getParameter("pageNum")); Map<String,Object>maps=newHashMap<>(); maps.put("pageSize",pageSize); maps.put("pageNum",(pageNum-1)*pageSize); List<News>list=userService.selectAllUsers(maps); intcount=userService.selectCountUsers(); Paginationpage=newPagination(count); page.setCurrentPage(pageNum); mv.addObject("pnums",page.getPageNumList()); mv.addObject("currentPage",pageNum); mv.addObject("pnext_flag",page.nextEnable()); mv.addObject("plast_flag",page.lastEnable()); page.lastPage(); mv.addObject("last_page",page.getCurrentPage()); mv.addObject("count",count); mv.addObject("pageCount",page.getPages()); if(list!=null&&list.size()>0){ //用户存在 mv.addObject("partners",list); //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面 mv.setViewName("/users/users"); }else{ //用户存在 mv.addObject("partners",list); //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面 mv.setViewName("/users/users"); } }catch(Exceptione){ //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面 mv.setViewName("/users/users"); } returnmv; } @RequestMapping(value="/add",method=RequestMethod.POST) publicStringaddUser(@RequestParamMultipartFile[]myfiles,HttpServletRequestrequest)throwsIOException{ Stringusername=request.getParameter("username"); Stringnickname=request.getParameter("nickname"); Stringpassword=request.getParameter("password"); Stringemail=request.getParameter("email"); System.out.println("name:"+username); System.out.println("nickname:"+nickname); System.out.println("password:"+password); System.out.println("email:"+email); //如果只是上传一个文件,则只需要MultipartFile类型接收文件即可,而且无需显式指定@RequestParam注解 //如果想上传多个文件,那么这里就要用MultipartFile[]类型来接收文件,并且还要指定@RequestParam注解 //并且上传多个文件时,前台表单中的所有<inputtype="file"/>的name都应该是myfiles,否则参数里的myfiles无法获取到所有上传的文件 for(MultipartFilemyfile:myfiles){ if(myfile.isEmpty()){ System.out.println("文件未上传"); }else{ System.out.println("文件长度:"+myfile.getSize()); System.out.println("文件类型:"+myfile.getContentType()); System.out.println("文件名称:"+myfile.getName()); System.out.println("文件原名:"+myfile.getOriginalFilename()); System.out.println("========================================"); //如果用的是Tomcat服务器,则文件会上传到\\%TOMCAT_HOME%\\webapps\\YourWebProject\\WEB-INF\\upload\\文件夹中 StringrealPath=request.getSession().getServletContext().getRealPath("/WEB-INF/upload"); //这里不必处理IO流关闭的问题,因为FileUtils.copyInputStreamToFile()方法内部会自动把用到的IO流关掉,我是看它的源码才知道的 FileUtils.copyInputStreamToFile(myfile.getInputStream(),newFile(realPath,myfile.getOriginalFilename())); } } return"../../index"; } }
记得在WEB-INFO建立存放上传文件目录(upload)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。