1. 程式人生 > 其它 >SpringBoot - MultipartFile檔案上傳及nginx配置

SpringBoot - MultipartFile檔案上傳及nginx配置

技術標籤:javajavanginx

  • 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;
}