Spring MVC4使用Servlet3 MultiPartConfigElement文件上传实例
2021-07-20 06:05
YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
åœ¨è¿™ç¯‡æ–‡ç« ä¸ï¼Œæˆ‘们将使用Servlet3.0以åŠjavax.servlet.MultipartConfigElement,为了激活 Servlet3.0环境和Spring 的Multipart支æŒï¼Œä½ 需è¦åšä»¥ä¸‹ï¼š
1.æ·»åŠ StandardServletMultipartResolver Bean 在 Spring é…ç½®ã€‚è¿™æ˜¯ä¸€ä¸ªæ ‡å‡†å®žçŽ° MultipartResolver 接å£ï¼ŒåŸºäºŽServlet3.0 javax.servlet.http.Part API。
2. å¯ç”¨åœ¨Servlet3.0环境的多解æž(MultiParsing)。è¦åšåˆ°è¿™ä¸€ç‚¹ï¼Œä½ æœ‰å¤šç§æ–¹æ¡ˆå¯ä¾›é€‰æ‹©ã€‚
- 方案A. 对方案性 Servlet 注册设置 javax.servlet.MultipartConfigElement。MultipartConfigElement是javax.servlet.annotation.MultipartConfig 的注释值(如选择C所述)的简å•Javaç±»è¡¨ç¤ºã€‚Â è¿™ç¯‡æ–‡ç« å°†ç‰¹åˆ«ä¾§é‡äºŽè¿™ä¸ªé€‰æ‹©ã€‚
- 方案B. 如果您使用基于XMLçš„é…置,å¯ä»¥åœ¨web.xmlä¸åœ¨servleté…置声明 multipart-configsection 部分,如下图所示:
SpringDispatcher org.springframework.web.servlet.DispatcherServlet /tmp 5242880 20971520 0 - 方案C. å¯ä»¥åˆ›å»ºä¸€ä¸ªè‡ªå®šä¹‰ Servlet å’Œ javax.servlet.annotation.MultipartConfig æ ‡æ³¨å…¶æ ‡æ³¨ï¼Œå¦‚ä¸‹å›¾æ‰€ç¤ºï¼š
@WebServlet(name = "fileUploadServlet", urlPatterns = {"/upload"}) @MultipartConfig(location=/tmp, fileSizeThreshold=0, maxFileSize=5242880, // 5 MB maxRequestSize=20971520) // 20 MB public class FileUploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //handle file upload }
- Spring 4.2.0.RELEASE
- validation-api 1.1.0.Final
- Bootstrap v3.3.2
- Maven 3
- JDK 1.7
- Tomcat 8.0.21
- Eclipse JUNO Service Release 2
Let’s begin.
4.0.0 com.yiibai.springmvc Spring4MVCFileUploadMultipartFilewar 1.0.0 Spring4MVCFileUploadMultipartFile Maven Webapp http://maven.apache.org 4.2.0.RELEASE org.springframework spring-webmvc${springframework.version} javax.validation validation-api1.1.0.Final javax.servlet javax.servlet-api3.1.0 javax.servlet jstl1.2 org.apache.maven.plugins maven-war-plugin2.4 src/main/webapp Spring4MVCFileUploadMultipartFile false Spring4MVCFileUploadMultipartFile
package com.yiibai.springmvc.configuration; import javax.servlet.MultipartConfigElement; import javax.servlet.ServletRegistration; 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[] { "/" }; } @Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { registration.setMultipartConfig(getMultipartConfigElement()); } private MultipartConfigElement getMultipartConfigElement() { MultipartConfigElement multipartConfigElement = new MultipartConfigElement( LOCATION, MAX_FILE_SIZE, MAX_REQUEST_SIZE, FILE_SIZE_THRESHOLD); return multipartConfigElement; } private static final String LOCATION = "C:/temp/"; // Temporary location where files will be stored private static final long MAX_FILE_SIZE = 5242880; // 5MB : Max file size. // Beyond that size spring will throw exception. private static final long MAX_REQUEST_SIZE = 20971520; // 20MB : Total request size containing Multi part. private static final int FILE_SIZE_THRESHOLD = 0; // Size threshold after which files will be written to disk }
é…ç½®StandardServletMultipartResolver Beanã€‚è¿™æ˜¯ä¸€ä¸ªæ ‡å‡†å®žçŽ°MultipartResolver接å£ï¼ŒåŸºäºŽServlet3.0 javax.servlet.http.Part API。
package com.yiibai.springmvc.configuration; 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.support.StandardServletMultipartResolver; 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.yiibai.springmvc") public class HelloWorldConfiguration extends WebMvcConfigurerAdapter { @Bean(name = "multipartResolver") public StandardServletMultipartResolver resolver() { return new StandardServletMultipartResolver(); } @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/"); } }
messages /WEB-INF/views/ .jsp
Springæä¾› org.springframework.web.multipart.MultipartFile, 这是一个 multipartÂ è¯·æ±‚èŽ·å¾—ä¸Šä¼ æ–‡ä»¶çš„è¡¨ç¤ºã€‚Â å®ƒæä¾›äº†æ–¹ä¾¿çš„æ–¹æ³•,如getName(),getContentType(),GetBytes(),getInputStream()ç‰ã€‚è¿™è®©æˆ‘ä»¬å¤„ç†æ›´å®¹æ˜“ä¸€ç‚¹ï¼ŒåŒæ—¶æ£€ç´¢æœ‰å…³è¢«ä¸Šä¼ 文件的信æ¯ã€‚
package com.yiibai.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.yiibai.springmvc.model; import java.util.ArrayList; import java.util.List; public class MultiFileBucket { Listfiles = 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.yiibai.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.yiibai.springmvc.model.FileBucket; import com.yiibai.springmvc.model.MultiFileBucket; import com.yiibai.springmvc.util.FileValidator; import com.yiibai.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"); ListfileNames = 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"; } } } Â
以上控制器是相当微ä¸è¶³é“。它处ç†ä¸Šä¼ 视图的GETå’ŒPOSTè¯·æ±‚çš„æ–‡ä»¶ã€‚å½“æ–‡ä»¶ä»Žæ–‡ä»¶é€‰æ‹©å™¨ï¼Œç”¨æˆ·é€‰æ‹©ç‚¹å‡»ä¸Šä¼ ï¼Œæˆ‘ä»¬åªæ˜¯åˆ›å»ºå…·æœ‰ç›¸åŒçš„åç§°å’Œå—节的内容作为原始文件的新文件,从原始å¤åˆ¶æ–‡ä»¶çš„å—节数。为æ¤ï¼Œæˆ‘们æ£åœ¨ä½¿ç”¨Spring FileCopyUtils工具类æµä»Žæºå¤åˆ¶åˆ°ç›®çš„地。在这个例åä¸ï¼Œæˆ‘们指定的目的地是 C:/mytemp 文件夹,所有文件将å˜åœ¨è¿™ä¸ªæ–‡ä»¶å¤¹ä¸ã€‚
package com.yiibai.springmvc.util; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.Validator; import com.yiibai.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.yiibai.springmvc.util; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.Validator; import com.yiibai.springmvc.model.FileBucket; import com.yiibai.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
Spring 4 MVC File Upload Example Spring 4 MVC File Upload Example
Home
success.jsp
File Upload Success
multiFileUploader.jsp
Spring 4 MVC File Multi Upload Example
multiSuccess.jsp
File Upload Success
welcome.jsp
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
现在构建 war(å‰é¢çš„Eclipse教程)或通过Maven的命令行( mvn clean install).部署 war 到Servlet3.0容器。
打开æµè§ˆå™¨ï¼Œæµè§ˆÂ http://localhost:8080/Spring4MVCFileUploadMultipart/
您å¯ä»¥æŸ¥çœ‹ä¸Šä¼ 的文件夹 [C:/mytemp]Â å¯¹äºŽä¸Šä¼ çš„æ–‡ä»¶ã€‚Â
选择è¦ä¸Šä¼ 的文件。
最åŽï¼ŒæŸ¥çœ‹å˜å‚¨æ–‡ä»¶å¤¹Â [C:/mytemp].
下一篇:Spring MVC文件上传教程
文章标题:Spring MVC4使用Servlet3 MultiPartConfigElement文件上传实例
文章链接:http://soscw.com/index.php/essay/106492.html