首先需要配置是加入两个 jar包:
commons-fileupload-1.2.2.jar
commons-io-2.1.jar
1. 文件配置
SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver来明确告诉DispatcherServlet如何处理MultipartRequest
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760000"></property>
<property name="maxInMemorySize" value="40960"></property>
</bean>
其中属性详解:
defaultEncoding=”UTF-8″ 是请求的编码格式,默认为iso-8859-1
maxUploadSize=”5400000″ 是上传文件的大小,单位为字节
uploadTempDir=”fileUpload/temp” 为上传文件的临时路径
注意这里的文件尺寸实际上只的是所有文件总大小,如果不设置大小,则默认是不限制文件大小
如果配置了文件大小就以为这你需要配置异常信息控制
所以需要配置异常显示
<!– SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException –>
<!– 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 –>
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 -->
<prop
key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop>
</props>
</property>
</bean>
如果非要控制返回信息,可以考虑异常处理中返回指定格式数据,例如JSON ??
配置完了页面上一如既往的需要再form表单中增加:enctype=”multipart/form-data”, method=”post”
然后就是需要处理的action了,可以有两种方式
第一种方式:
单文件
public String xxx( @RequestParam MultipartFile file, ...) {
………………
}
多文件
public String xxx(@RequestParam MultipartFile[] files, ...) {
………………
}
第二种方式:
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 转型为MultipartHttpRequest:
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 获得文件:
MultipartFile file = multipartRequest.getFile(" file ");
}
示例代码
@RequestMapping("/upload2" )
public String upload2(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException {
//创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求
if(multipartResolver.isMultipart(request)){
//转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
//取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while(iter.hasNext()){
//取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
if(file != null){
//取得当前上传文件的文件名称
String myFileName = file.getOriginalFilename();
//如果名称不为“”,说明该文件存在,否则说明该文件不存在
if(myFileName.trim() !=""){
//定义上传路径
String path = request.getSession().getServletContext().getRealPath("/upload")+ file.getOriginalFilename();
File localFile = new File(path);
//效率比使用字节流转存高的多
file.transferTo(localFile);
}
}
}
}
return "/success";
}
MultipartFile类常用的一些方法:
String getContentType()//获取文件MIME类型
InputStream getInputStream()//后去文件流
String getName() //获取表单中文件组件的名字
String getOriginalFilename() //获取上传文件的原名
long getSize() //获取文件的字节大小,单位byte
boolean isEmpty() //是否为空
void transferTo(File dest)//保存到一个目标文件中