Commons fileupload是当前比较流行的文件上传组件,Spring为提供了对Commons fileupload的集成,只需简单几步便可轻易实现文件上传,十分简便。
一。引入必要的jar包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.5.RELEASE</version> </dependency> <!-- commons-fileupload dependencies --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency>
Spring提供的集成Commons fileupload的接口和类都在spring-webmvc这个包里,如
CommonsMultipartResolver,CommonsFileUploadSupport,MultipartResolver,
MultipartHttpServletRequest等。
二。定义multipartResolver bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxInMemorySize" value="10240"/> <property name="maxUploadSize" value="50000000"/> </bean> </beans>
multipartResolver这个标志符是固定不可改变的,因为研究Spring源代码发现在核心控制器DispatcherServlet
里,有这样几段代码:
/** Well-known name for the MultipartResolver object in the bean factory for this namespace. */ public static final String MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver";
/** * Initialize the MultipartResolver used by this class. * <p>If no bean is defined with the given name in the BeanFactory for this namespace, * no multipart handling is provided. */ private void initMultipartResolver(ApplicationContext context) { try { this.multipartResolver = context.getBean(MULTIPART_RESOLVER_BEAN_NAME, MultipartResolver.class); if (logger.isDebugEnabled()) { logger.debug("Using MultipartResolver [" + this.multipartResolver + "]"); } } catch (NoSuchBeanDefinitionException ex) { // Default is no multipart resolver. this.multipartResolver = null; if (logger.isDebugEnabled()) { logger.debug("Unable to locate MultipartResolver with name '" + MULTIPART_RESOLVER_BEAN_NAME + "': no multipart request handling provided"); } } }
这以上代码发现,Spring使 用MULTIPART_RESOLVER_BEAN_NAME这个名字来获取在
application-context.xml定义的CommonsMultipartResolver bean,该bean用于解析上传文件表单。
三。一个简单的文件上传表单控制器
package com.dream.controllers.photo;
import com.dream.model.photo.Photo; import com.dream.service.standard.PhotoService; import com.dream.utils.StringChecker; import org.springframework.validation.BindException; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.SimpleFormController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; /** * Created by IntelliJ IDEA. * User: Zhong Gang * Date: 11-8-15 * Time: 下午10:12 */ public class PhotoFormController extends SimpleFormController { private static final String FILE_UPLOAD_PATH = "F://jetty-distribution-7.4.5.v20110725//upload//"; private PhotoService photoService; public PhotoFormController() { setCommandName("photo"); setCommandClass(Photo.class); setFormView("photo/photoform"); } @Override protected Object formBackingObject(HttpServletRequest request) throws Exception { String photoGuid = ServletRequestUtils.getStringParameter(request, "photoGuid"); if (StringChecker.hasText(photoGuid)) { Photo photo = photoService.loadPhotoByGuid(photoGuid); return photo; } return new Photo(); } @Override protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { Photo photo = (Photo) command; MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; MultipartFile file = multipartRequest.getFile("file"); String fileName = file.getOriginalFilename(); String path = FILE_UPLOAD_PATH + fileName; photo.setPath(fileName); File destination = new File(path); file.transferTo(destination); photoService.saveOrUpdate(photo); return new ModelAndView("photo/photoview", "photo", photo); } public void setPhotoService(PhotoService photoService) { this.photoService = photoService; } }
四。文件上传表单
<%-- Created by IntelliJ IDEA. User: ZhongGang Date: 11-8-15 Time: 下午10:34 --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>Photo form</title> <link href="/resources/css/main.css" rel="stylesheet" type="text/css" media="screen"/> </head> <body> <div id="wrapper"> <jsp:include page="../decorator/header.jsp"/> <div id="page"> <div> <form:form commandName="photo" enctype="multipart/form-data"> <table> <tr> <td>Name :</td> <td> <form:input path="name"/> </td> </tr> <tr> <td> Upload file: </td> <td> <input type="file" name="file"/> </td> </tr> <tr> <td>Description :</td> <td> <form:input path="description"/> </td> </tr> <tr> <td colspan="2"> <input type="submit" value="Submit"/> </td> </tr> </table> </form:form> </div> </div> <jsp:include page="../decorator/footer.jsp"/> </div> </body> </html>