Spring 内置对多路上传的支持,专门用于处理 Web 应用中的文件上传。 开发者可以通过注册一个可插拔的 MultipartResolver 对象来启用对文件多路上传的支持。该接口在定义于 org.springframework.web.multipart 包下。Spring 为一般的文件上传提供了 MultipartResolver 接口的一个实现,为 Servlet 3.0 多路请求的转换提供了另一个实现。
默认情况下,Spring 的多路上传支持是不开启的,因为有些开发者希望由 自己来处理多路请求。如果想启用 Spring 的多路上传支持,你需要在 Web 应用的上下文中添加一个多路传输解析器。每个进来的请求,解析器都会检 查是不是一个多部分请求。若发现请求是完整的,则请求按正常流程被处理;如果发现请求是一个多路请求,则你在上下文中注册的 MultipartResolver 解析器会被用来处理该请求。之后,请求中的多部分上传属性就与其他属性一样被正常对待了。
1、CommonsMultipartResolver
在spring配置文件中配置id为multipartResolver的bean,如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<property name="maxUploadSize" value="2048" />
</bean>
当然,要让多路解析器正常工作,你需要在 classpath 路径下准备必须的 jar 包。如果使用的是通用的多路上传解析器 CommonsMultipartResolver,开发者所需要的 jar 包是 commons-fileupload.jar。
在pom.xml中间中添加如下依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
当 Spring 的 DispatcherServlet 检测到一个多部分请求时,它会激活在上下文中声明的多路解析器并把请求交给它。解析器会把当前的 HttpServletRequest 请求对象包装成一个支持多路文件上传的请求对象 MultipartHttpServletRequest。有了 MultipartHttpServletRequest 对象,你不仅可以获取该多路请求中的信息,还可以在你的控制器中获得该多路请求的内容本身。
2、上传文件Controller控制器
文件上传控制器与一般注解了@Controller 的控制器基本一样,除了它接受的方法参数类型是 MultipartHttpServletRequest 或 MultipartFile。
@Controller
public class UploadFileController {
@RequestMapping(value = "/upload.do",method = RequestMethod.POST)
public String handleFormUpload(MultipartFile uploadFile, HttpServletRequest request){
if (uploadFile.isEmpty()){
System.out.println("file not find");
}
try {
byte[] bytes = uploadFile.getBytes();
// 其他的处理逻辑
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
}
在上面的例子中,最终拿到了 byte[]文件数据,只是没对它做任 何事。在实际应用中,可能会将它保存到数据库、存储在文件系统上,或做其他的处理。 当使用 Servlet 3.0 的多路传输转换时,你也可以使用 javax.servlet.http.Part
3、上传文件的表单文件
当解析器 MultipartResolver 完成处理时,请求便会像其他请求一样被正常流程处理。首先,创建一个接受文件上传的表单将允许用于直接上传整个表单。编码属性(enctype="multipart/form-data")能让浏览器知道如何对多路上传请求的表单进行编码(encode)。
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>upload file</title>
</head>
<body>
<h1>please select a file:</h1>
<form action="${pageContext.request.contextPath}/upload.do" method="POST" enctype="multipart/form-data">
<input type="file" name="uploadFile"/>
<input type="submit"/>
</form>
</body>
</html>
4、测试
启动项目之后访问upload.jsp可出现如下页面:
选择一个文件提交之后:
一个利用Spring MVC简单的实现文件上传的功能就完成了。