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>