SpringMVC实现文件上传
文件上传是Web开发中的一个重要的功能点。同样,SpringMVC也可以通过简单的配置就可以实现文件的上传以及对上传的文件的处理。具体步骤如下:
一 新建测试项目以及导入jar包
详细过程不用多说,项目结构和需要的jar包如下:
二 项目的常规配置以及实现上传需要的配置
(1)web.xml:
在这里只用了简单的常规配置,不用多说:
<web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1"><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.html</url-pattern></servlet-mapping><filter><filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>
(2)springmvc-servlet.xml:
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"><context:component-scanbase-package="cn.zifangsky.**.controller"/><context:annotation-config/><!--激活Bean中定义的注解--><mvc:annotation-driven/><!--视图相关配置--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"value="/WEB-INF/pages/"/><!--视图前缀--><propertyname="suffix"value=".jsp"/><!--视图后缀--></bean><beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><propertyname="uploadTempDir"value="/tmp"/><!--临时目录--><propertyname="maxUploadSize"value="10485760"/><!--10M--></bean></beans>
在上面的代码中的最后一段,配置了一个名为”multipartResolver“的bean,这里就是配置了Commons FileUpload来处理文件上传
三 文件上传处理流程
(1)首页index.jsp:
<%response.sendRedirect("form.html");%>
(2)模型类User.java:
packagecn.zifangsky.model;publicclassUser{privateStringuserName;//用户名privateStringlogoSrc;//头像地址publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){this.userName=userName;}publicStringgetLogoSrc(){returnlogoSrc;}publicvoidsetLogoSrc(StringlogoSrc){this.logoSrc=logoSrc;}}
(3)文件上传表单和结果展示页fileupload.jsp:
<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@taglibprefix="mvc"uri="http://www.springframework.org/tags/form"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><html><head><title>SpringMVC文件上传</title></head><body><h3>图片文件上传</h3><mvc:formmodelAttribute="user"action="upload.html"enctype="multipart/form-data"><table><tr><td>用户名:</td><td><mvc:inputpath="userName"/></td></tr><tr><td>选择头像:</td><td><inputtype="file"name="file"/></td></tr><tr><tdcolspan="2"><inputtype="submit"value="Submit"/></td></tr></table></mvc:form><br><br><c:iftest="${u!=null}"><h3>上传结果</h3><table><c:iftest="${u.userName!=null}"><tr><td>用户名:</td><td>${u.userName}</td></tr></c:if><c:iftest="${u.logoSrc!=null}"><tr><td>头像:</td><td><imgsrc="${u.logoSrc}"width="100px"height="100px"></td></tr></c:if></table></c:if></body></html>
可以看出,在上面的form表单中定义的是文件上传表单,同时为了能够上传文件,添加了一个enctype=”multipart/form-data”属性。后面就是结果展示页了,使用JSTL标签来判断是否有结果,有的话就显示出来
(4)后台处理UploadController.java:
packagecn.zifangsky.controller;importjava.io.File;importjava.io.IOException;importjavax.servlet.http.HttpServletRequest;importorg.apache.commons.io.FileUtils;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;importcn.zifangsky.model.User;importcn.zifangsky.utils.StringUtile;@ControllerpublicclassUploadController{@RequestMapping(value="/form")publicModelAndViewform(){ModelAndViewmodelAndView=newModelAndView("fileupload","user",newUser());returnmodelAndView;}@RequestMapping(value="/upload",method=RequestMethod.POST)publicModelAndViewupload(Useruser,@RequestParam("file")MultipartFiletmpFile,HttpServletRequestrequest){ModelAndViewmodelAndView=newModelAndView("fileupload");if(tmpFile!=null){//获取物理路径StringtargetDirectory=request.getSession().getServletContext().getRealPath("/uploads");StringtmpFileName=tmpFile.getOriginalFilename();//上传的文件名intdot=tmpFileName.lastIndexOf('.');Stringext="";//文件后缀名if((dot>-1)&&(dot<(tmpFileName.length()-1))){ext=tmpFileName.substring(dot+1);}//其他文件格式不处理if("png".equalsIgnoreCase(ext)||"jpg".equalsIgnoreCase(ext)||"gif".equalsIgnoreCase(ext)){//重命名上传的文件名StringtargetFileName=StringUtile.renameFileName(tmpFileName);//保存的新文件Filetarget=newFile(targetDirectory,targetFileName);try{//保存文件FileUtils.copyInputStreamToFile(tmpFile.getInputStream(),target);}catch(IOExceptione){e.printStackTrace();}Useru=newUser();u.setUserName(user.getUserName());u.setLogoSrc(request.getContextPath()+"/uploads/"+targetFileName);modelAndView.addObject("u",u);}returnmodelAndView;}returnmodelAndView;}}
在上面的upload方法中,为了接收上传的文件,因此使用了一个MultipartFile类型的变量来接收上传的临时文件,同时为了给文件进行重命名,我调用了一个renameFileName方法,这个方法的具体内容如下:
/***文件重命名*/publicstaticStringrenameFileName(StringfileName){StringformatDate=newSimpleDateFormat("yyMMddHHmmss").format(newDate());//当前时间字符串intrandom=newRandom().nextInt(10000);Stringextension=fileName.substring(fileName.lastIndexOf("."));//文件后缀returnformatDate+random+extension;}
至此,全部处理逻辑已经完成。
四 效果测试
(1)文件上传表单:
(2)上传结果:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。