【本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看。源码下载地址在文章末尾。】
【翻译 by 明明如月 QQ 605283073】
上一篇:
原文地址:http://websystique.com/springmvc/spring-mvc-4-file-upload-example-using-commons-fileupload/
本文将实现使用SpringMultipartResolver实现单个或者多文件上传.Spring提供内置multipart 支持用来处理web 应用中文件上传。
注意:multipart 是 enctype=”multipart/form-data”的内容.
Spring使用MultiPartResolver接口实现文件上传
.
CommonsMultipartResolver
使用Apache Commons FileUpload 实现 MultipartResolver . 它需要apache 的commons-fileupload.jar 包. 虽然不针对Servlet 3但是Servlet 3.x容器中使用也没问题。"multipart-config"
节点配置DispatcherServlet.
如果是Annoataion/JavaConfig配置, 在DispatcherServlet 注册javax.servlet.MultipartConfigElement
.或者使用 @MultipartConfig定义
servlet.本文主要用CommonsMultipartResolver . 下一篇文章使用Servlet 3.0 来实现文件上传.
步骤:
类似如下:
....
....
用到的技术和软件
4.0.0
com.websystique.springmvc
Spring4MVCFileUploadCommonsExample
war
1.0.0
Spring4MVCFileUploadCommonsExample Maven Webapp
http://maven.apache.org
4.2.0.RELEASE
org.springframework
spring-webmvc
${springframework.version}
commons-fileupload
commons-fileupload
1.3.1
javax.validation
validation-api
1.1.0.Final
javax.servlet
javax.servlet-api
3.1.0
javax.servlet
jstl
1.2
org.apache.maven.plugins
maven-compiler-plugin
3.2
1.7
1.7
org.apache.maven.plugins
maven-war-plugin
2.4
src/main/webapp
Spring4MVCFileUploadCommonsExample
false
Spring4MVCFileUploadCommonsExample
package com.websystique.springmvc.configuration;
import java.io.IOException;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.websystique.springmvc")
public class HelloWorldConfiguration extends WebMvcConfigurerAdapter{
@Bean(name="multipartResolver")
public CommonsMultipartResolver getResolver() throws IOException{
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
//Set the maximum allowed size (in bytes) for each individual file.
resolver.setMaxUploadSizePerFile(5242880);//5MB
//You may also set other available properties.
return resolver;
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
registry.viewResolver(viewResolver);
}
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
return messageSource;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
}
配置里面最重要的是 CommonsMultipartResolver Bean. 它是Apache Commons FileUpload里面的 MultipartResolver接口的实现。
你可以设置文件最大限制, headerEncoding 等,我们例子里只限制5M。
对应的XML配置形式:
messages
/WEB-INF/views/
.jsp
Spring提供 org.springframework.web.multipart.MultipartFile
类代表上传的文件,提供getName(), getContentType(), getBytes(), getInputStream()等方法。
package com.websystique.springmvc.model;
import org.springframework.web.multipart.MultipartFile;
public class FileBucket {
MultipartFile file;
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
}
}
包装类:
package com.websystique.springmvc.model;
import java.util.ArrayList;
import java.util.List;
public class MultiFileBucket {
List files = new ArrayList();
public MultiFileBucket(){
files.add(new FileBucket());
files.add(new FileBucket());
files.add(new FileBucket());
}
public List getFiles() {
return files;
}
public void setFiles(List files) {
this.files = files;
}
}
package com.websystique.springmvc.controller;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.FileCopyUtils;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import com.websystique.springmvc.model.FileBucket;
import com.websystique.springmvc.model.MultiFileBucket;
import com.websystique.springmvc.util.FileValidator;
import com.websystique.springmvc.util.MultiFileValidator;
@Controller
public class FileUploadController {
private static String UPLOAD_LOCATION="C:/mytemp/";
@Autowired
FileValidator fileValidator;
@Autowired
MultiFileValidator multiFileValidator;
@InitBinder("fileBucket")
protected void initBinderFileBucket(WebDataBinder binder) {
binder.setValidator(fileValidator);
}
@InitBinder("multiFileBucket")
protected void initBinderMultiFileBucket(WebDataBinder binder) {
binder.setValidator(multiFileValidator);
}
@RequestMapping(value={"/","/welcome"}, method = RequestMethod.GET)
public String getHomePage(ModelMap model) {
return "welcome";
}
@RequestMapping(value="/singleUpload", method = RequestMethod.GET)
public String getSingleUploadPage(ModelMap model) {
FileBucket fileModel = new FileBucket();
model.addAttribute("fileBucket", fileModel);
return "singleFileUploader";
}
@RequestMapping(value="/singleUpload", method = RequestMethod.POST)
public String singleFileUpload(@Valid FileBucket fileBucket, BindingResult result, ModelMap model) throws IOException {
if (result.hasErrors()) {
System.out.println("validation errors");
return "singleFileUploader";
} else {
System.out.println("Fetching file");
MultipartFile multipartFile = fileBucket.getFile();
//Now do something with file...
FileCopyUtils.copy(fileBucket.getFile().getBytes(), new File(UPLOAD_LOCATION + fileBucket.getFile().getOriginalFilename()));
String fileName = multipartFile.getOriginalFilename();
model.addAttribute("fileName", fileName);
return "success";
}
}
@RequestMapping(value="/multiUpload", method = RequestMethod.GET)
public String getMultiUploadPage(ModelMap model) {
MultiFileBucket filesModel = new MultiFileBucket();
model.addAttribute("multiFileBucket", filesModel);
return "multiFileUploader";
}
@RequestMapping(value="/multiUpload", method = RequestMethod.POST)
public String multiFileUpload(@Valid MultiFileBucket multiFileBucket, BindingResult result, ModelMap model) throws IOException {
if (result.hasErrors()) {
System.out.println("validation errors in multi upload");
return "multiFileUploader";
} else {
System.out.println("Fetching files");
List fileNames= new ArrayList();
//Now do something with file...
for(FileBucket bucket : multiFileBucket.getFiles()){
FileCopyUtils.copy(bucket.getFile().getBytes(), new File(UPLOAD_LOCATION + bucket.getFile().getOriginalFilename()));
fileNames.add(bucket.getFile().getOriginalFilename());
}
model.addAttribute("fileNames", fileNames);
return "multiSuccess";
}
}
}
Spring FileCopyUtils 工具类,可以将流从一个地方拷贝到目标文件夹。例子中目标目录是
C:/mytemp 所有文件将传到这里。
package com.websystique.springmvc.util;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import com.websystique.springmvc.model.FileBucket;
@Component
public class FileValidator implements Validator {
public boolean supports(Class clazz) {
return FileBucket.class.isAssignableFrom(clazz);
}
public void validate(Object obj, Errors errors) {
FileBucket file = (FileBucket) obj;
if(file.getFile()!=null){
if (file.getFile().getSize() == 0) {
errors.rejectValue("file", "missing.file");
}
}
}
}
package com.websystique.springmvc.util;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import com.websystique.springmvc.model.FileBucket;
import com.websystique.springmvc.model.MultiFileBucket;
@Component
public class MultiFileValidator implements Validator {
public boolean supports(Class clazz) {
return MultiFileBucket.class.isAssignableFrom(clazz);
}
public void validate(Object obj, Errors errors) {
MultiFileBucket multiBucket = (MultiFileBucket) obj;
int index=0;
for(FileBucket file : multiBucket.getFiles()){
if(file.getFile()!=null){
if (file.getFile().getSize() == 0) {
errors.rejectValue("files["+index+"].file", "missing.file");
}
}
index++;
}
}
}
messages.properties
missing.file= Please select a file.
singleFileUploader.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
Spring 4 MVC File Upload Example
Spring 4 MVC File Upload Example
Upload a file
Home
success.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
File Upload Success
File ${fileName} uploaded successfully.
Home
multiFileUploader.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
Spring 4 MVC File Multi Upload Example
Spring 4 MVC Multi File Upload Example
Home
multiSuccess.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
File Upload Success
File ${fileName} uploaded successfully
Home
welcome.jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Spring 4 MVC File Upload Example
Welcome to FileUploader Example
Click on below links to see FileUpload in action.
Single File Upload OR Multi File Upload
package com.websystique.springmvc.configuration;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class[] getRootConfigClasses() {
return new Class[] { HelloWorldConfiguration.class };
}
@Override
protected Class[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
在tomcat里面发布
访问 http://localhost:8080/Spring4MVCFileUploadCommonsExample/
点击 单文件上传链接:
如果没有选择文件直接点击“upload”
提示:请选择一个文件
选择文件
你可以去C:/mytemp 文件夹看看,文件是否传上去了
现在返回 选择 multi upload(多文件)上传链接
如果没有选择文件 直接点击上传也会有验证失败的提示:
选择文件:
查看上传的文件:
本文结束。下一篇将讲述 使用Spring 3.0指定api实现文件上传》
项目下载地址:http://websystique.com/?smd_process_download=1&download_id=1741
网盘链接: https://pan.baidu.com/s/1mqUczr0i4goBSNAehPd42A 密码: 5w3k