世上最快樂的事,莫過於爲理想而奮鬥。java
一、multipart請求web
通常表單提交所造成的請求結果時很簡單的,就是以"&"符分割的多個name-value對,如:"firstName=Charles&lastName=Bob"。對於典型的基於文本的表單提交,這種編碼形式也足夠知足要求,可是對於multipart請求中傳送二進制數據,就顯得力不從心。spring
對於multipart請求,對於multipart格式的二進制數據會將一個表單拆分爲多個部分(part),每一個部分對應一個輸入域。在通常的表單輸入 域中它所對應的部分中會放置文本型數據,可是若是上傳文件的話,它所對應的部分能夠是二進制。瀏覽器
二、配置multipart解析器app
從 Spring 3.1 開始,Spring 內置了兩個 MultipartResolver 類的實現供咱們選擇:ide
1) CommonMultipartResolver:使用 Jakarta Commons FileUpload 解析 multipart 請求。編碼
2)StandardServletMultipartResolver:依賴於 Servlet 3.0 對 multipart 請求的支持。spa
2.1 使用 Servlet 3.0 解析 multipart 請求(配置StandardServletMultipartResolver)code
package com.spring.fileupload.config; import javax.servlet.MultipartConfigElement; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration.Dynamic; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.servlet.DispatcherServlet; public class FileUpLoadWebAppInitialzer implements WebApplicationInitializer{ public void onStartup(ServletContext servletContext) throws ServletException { DispatcherServlet ds = new DispatcherServlet(); Dynamic registration = servletContext.addServlet("appServlet", ds); registration.addMapping("/"); registration.setMultipartConfig( new MultipartConfigElement("/temp/uploads")); } }
2)若是咱們配置 DispatcherServelt 的 Servlet 初始化類繼承了 AbstractAnnotationConfigDispatcherServletInitilaizer 或orm
AbstractDispatcherServletInitializer 的話,咱們能夠經過重載 customizeRegistration() 方法來配置 multipart 的具體細節。
package com.spring.fileupload.config; import javax.servlet.MultipartConfigElement; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration.Dynamic; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class FileUpLoadWebAppInitialzer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { // TODO Auto-generated method stub return new Class<?>[] { RootConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() { // TODO Auto-generated method stub return new Class<?>[] { WebConfig.class }; } @Override protected String[] getServletMappings() { // TODO Auto-generated method stub return new String[] { "/" }; } @Override protected void customizeRegistration(Dynamic registration) { // TODO Auto-generated method stub new MultipartConfigElement("/temp/uploads"); } }
3)除了指定上傳文件的臨時目錄外,咱們還能夠經過其餘的構造器來配置 multipart 的具體細節,如:
(1) 限定上傳文件的最大容量(以字節爲單位),默認是沒有限制的。
(2)限定整個 multipart 請求的最大容量(以字節爲單位),默認是沒有限制的。
(3)在上傳的過程當中,若是文件達到指定大小(以字節爲單位),將會寫入到臨時文件路徑中,默認爲0。
2.2 配置 Jakarta Commons FileUpload multipart 解析器
package com.spring.fileupload.config; import java.io.IOException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.FileSystemResource; import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration @EnableWebMvc @ComponentScan("com.spring.fileupload") public class WebConfig extends WebMvcConfigurerAdapter{ @Bean public MultipartResolver multipartResolver() throws IOException { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); //設置臨時目錄路徑 multipartResolver.setUploadTempDir(new FileSystemResource("/temp/uploads")); //限定最大的文件容量爲2MB multipartResolver.setMaxUploadSize(2097152); //限定最大的內存大小爲0字節 multipartResolver.setMaxInMemorySize(0); return multipartResolver; } }
三、處理multipart請求
<!-- enctype屬性設置告訴瀏覽器以multipart數據的形式提交表單 --> <form action="/uploadImg" enctype="multipart/form-data"> <label>Upload Picture</label> <!-- accept屬性設置將上傳文件類型限制爲JPEG,PNG以及GIF圖片 --> <input type="file" name="picture" accept="image/jpeg,image/png,image/gif"> </form>
當表單提交時,咱們編寫的控制器方法就會接受上傳的文件數據。
@RequestMapping(value="/uploadImg") public String uploadPicture( @RequestPart("picture") byte[] picture ) { return "success"; }