Spring_SpringMVC處理文件上傳

世上最快樂的事,莫過於爲理想而奮鬥。 —— 蘇格拉底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";
    }
相關文章
相關標籤/搜索