SpringBoot - MultipartFile檔案上傳及nginx配置
阿新 • • 發佈:2020-12-16
- Controller的接收有2種方式,原理都是org.springframework.web.multipart.support.StandardMultipartHttpServletRequest
@PostMapping(value = "/testMultipartFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public String testMultipartFile(@RequestParam(value = "file[]", required = true) List<MultipartFile> multipartFile) { String fileName = multipartFile.get(0).getOriginalFilename(); String pathname = TMP + fileName; try { multipartFile.get(0).transferTo(new File(pathname)); } catch (Exception e) { log.error("testMultipartFile exception!", e); } return fileName; } @PostMapping(value = "/upload") public String upload(HttpServletRequest request) { MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class); multipartRequest.getFileNames().forEachRemaining(t->log.info(t)); List<MultipartFile> multipartFiles = multipartRequest.getFiles("file[]"); MultipartFile[] multipartFile = multipartFiles.toArray(new MultipartFile[0]); String fileName = multipartFile[0].getOriginalFilename(); String pathname = TMP + fileName; return pathname; }
- application.yml
spring.servlet.multipart: max-file-size: 10MB # 檔案的最大大小 max-request-size: 50MB # 請求的最大大小 file-size-threshold: 0 # 檔案大小閾值,當大於這個閾值時將寫入到磁碟,否則在記憶體中。 預設值為0
SpringBoot提供了自動裝配類org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,裝配屬性見MultipartProperties
前端使用Content-Type="multipart/form-data" + POST
- nginx方面
需要設定檔案儲存的有讀寫許可權目錄,並必要的記憶體調整。
error_log /data/logs/error/nginx_error.log info; # 配置異常日誌檔案 http { sendfile on; # 開啟高效檔案傳輸模式 client_max_body_size 100m; # 預設 1M,表示客戶端請求伺服器最大允許大小。 如果請求的正文資料大於client_max_body_size,HTTP協議會報錯 413 Request Entity Too Large。 client_body_buffer_size 2m; # Nginx分配給請求資料的Buffer大小。如果請求的資料小於client_body_buffer_size直接將資料先在記憶體中儲存,如果請求的值大於client_body_buffer_size小於client_max_body_size,就會將資料先儲存到臨時檔案中。 client_body_temp_path /data/temp_file; # 檔案臨時目錄 需要有可讀寫許可權 log_format access '----$remote_addr - [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_real_ip [$upstream_addr]'; access_log /usr/local/nginx/log/access.log access; # 請求日誌 #Limit limit_req_zone $binary_remote_addr zone=xxx:10m rate=5r/s; # 限流 }
否則報錯
- 其次 在java程式碼端,有些影性的程式碼會導致導致MultipartFile解析為空。 如下文
@Bean
public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
dispatcherServlet.setPublishEvents(false);
ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
return registration;
}