處理 multipart 請求

multipart格式的數據會將一個表單拆分爲多個部分(part),每個部分對應一個輸入域。在一般的表單輸入域中,它所對應的部分中會放置文本型數據,但是如果上傳文件的話,它所對應的部分可以是二進制,下面展現了 multipart格式的請求體:
在這裏插入圖片描述
1、配置 multipart 解析器
要配置一個multipart解析器,通過它來告訴DispatcherServlet該如何讀取multipart請求。

Spring 內置了兩個MultipartResolver的實現:

  • CommonsMultipartResolver:使用Jakarta Commons FileUpload解析multipart請求;
  • StandardServletMultipartResolver:依賴於Servlet 3.0對multipart請求的支持(始於Spring 3.1)。

StandardServletMultipartResolver的配置:

 @Bean(name = "multipartResolver")
 public StandardServletMultipartResolver getStandardServletMultipartResolver(){
         return new StandardServletMultipartResolver();
 }

配置了繼承AbstractAnnotationConfigDispatcherServletInitializer的DispatcherServlet 的 servlet 初始化類,通過重載customizeRegistration()方法來配置multipart的具體細節:

    /*
    * 將上傳文件的臨時存儲目錄設置在“d:/tmp/spittr/uploads”中
   */
   @Override
   protected void customizeRegistration(Dynamic registration) {
       // 參數二:限制文件大小不超過2M,參數三:整個個請求不超過4M,參數三:“0”所有的文件都要寫在磁盤上。
       registration.setMultipartConfig(
               new MultipartConfigElement("d:/tmp/spittr/uploads", 2097152, 4194304, 0));
       //registration.setLoadOnStartup(); // 設置 load-on-startup優先級
       //registration.setInitParameter(); // 設置初始化參數
   }

在控制器方法參數上添加@RequestPart註解:

@PostMapping
public String processUpload(@RequestPart("file") MultipartFile file) {
    System.out.println("---->  " + file.getName() + "  ::  "  + file.getSize());
    return "redirect:/";
}

Multipart接口概況:

package org.springframework.web.multipart;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

public interface MultipartFile {
    String getName();
    String getOriginalFilename();
    String getContentType();
    boolean isEmpty();
    long getSize();
    byte[] getBytes() throws IOException;
    InputStream getInputStream() throws IOException;
    void transferTo(File dest) throws IOException;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章