亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot應用上傳文件時報錯的原因是什么

發布時間:2021-02-05 14:07:25 來源:億速云 閱讀:214 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關Spring Boot應用上傳文件時報錯的原因是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

問題描述

Spring Boot應用(使用默認的嵌入式Tomcat)在上傳文件時,偶爾會出現上傳失敗的情況,后臺報錯日志信息如下:“The temporary upload location is not valid”。

原因追蹤

這個問題的根本原因是Tomcat的文件上傳機制引起的!
Tomcat在處理文件上傳時,會將客戶端上傳的文件寫入臨時目錄,這個臨時目錄默認在/tmp路徑下,如:“/tmp/tomcat.6574404581312272268.18333/work/Tomcat/localhost/ROOT”。
而操作系統對于/tmp目錄會不定時進行清理,如果正好因為操作系統的清理導致對應的臨時目錄被刪除,客戶端再上傳文件時就會報錯:“The temporary upload location is not valid”。
實際上,追蹤一下源碼會發現,如果不明確設置Tomcat的文件上傳臨時目錄,默認讀取的是Servlet上下文對象的屬性“javax.servlet.context.tempdir”值,如下源碼:

  • org.apache.catalina.connector.Request

private void parseParts(boolean explicit) {
  //...
  MultipartConfigElement mce = this.getWrapper().getMultipartConfigElement();
  //...
  // 讀取MultipartConfigElement對象的location屬性
  String locationStr = mce.getLocation();
  File location;
  if (locationStr != null && locationStr.length() != 0) {
    location = new File(locationStr);
    if (!location.isAbsolute()) {
      location = (new File((File)context.getServletContext().getAttribute("javax.servlet.context.tempdir"), locationStr)).getAbsoluteFile();
    }
  } else {
    // 如果location屬性值為空,則讀取Servlet上下文對象的屬性“javax.servlet.context.tempdir”值(如:/tmp/tomcat.6574404581312272268.18333/work/Tomcat/localhost/ROOT)
    location = (File)context.getServletContext().getAttribute("javax.servlet.context.tempdir");
  }
  //...
}

解決辦法

既然是因為上傳文件的臨時路徑被刪除導致的問題,就要確保改臨時目錄不會被刪除。
2種解決方法:
(1)通過Spring Boot的配置參數“spring.servlet.multipart.location”明確指定上傳文件的臨時目錄,確保該路徑已經存在,而且該目錄不會被操作系統清除。

spring.servlet.multipart.location=/data/tmp

如上所示,將上傳文件的臨時目錄指定到路徑“/data/tmp”下。

實際上,在Spring Boot中關于上傳文件的所有配置參數如下所示:

# MULTIPART (MultipartProperties)
spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads.
spring.servlet.multipart.file-size-threshold=0B # Threshold after which files are written to disk.
spring.servlet.multipart.location= # Intermediate location of uploaded files.
spring.servlet.multipart.max-file-size=1MB # Max file size.
spring.servlet.multipart.max-request-size=10MB # Max request size.
spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.

(2)在Spring容器中明確注冊MultipartConfigElement對象,通過MultipartConfigFactory指定一個路徑。
在上述源碼追蹤中就發現,Tomcat會使用MultipartConfigElement對象的location屬性作為上傳文件的臨時目錄。

/**
 * 配置上傳文件臨時目錄
 * @return
 */
@Bean
public MultipartConfigElement multipartConfigElement() {
  MultipartConfigFactory factory = new MultipartConfigFactory();
  // tmp.dir參數在啟動腳本中設置
  String path = System.getProperty("tmp.dir");
  if(path == null || "".equals(path.trim())) {
    path = System.getProperty("user.dir");
  }
  String location = path + "/tmp";
  File tmpFile = new File(location);
  // 如果臨時目錄不存在則創建
  if (!tmpFile.exists()) {
    tmpFile.mkdirs();
  }
  // 明確指定上傳文件的臨時目錄
  factory.setLocation(location);
  return factory.createMultipartConfig();
}

關于“Spring Boot應用上傳文件時報錯的原因是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会理县| 梅河口市| 张家口市| 大竹县| 新竹县| 饶河县| 项城市| 仁布县| 定安县| 浪卡子县| 贵港市| 高安市| 旌德县| 黎城县| 尚义县| 崇阳县| 图们市| 乐都县| 武宁县| 磴口县| 南靖县| 子长县| 庄河市| 淄博市| 岳阳县| 东兴市| 南召县| 绵竹市| 安塞县| 都兰县| 城口县| 天等县| 长泰县| 西丰县| 太原市| 石嘴山市| 边坝县| 平江县| 桦南县| 涞源县| 宾川县|