首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring MVC 文件上傳:小檔案不生成臨時檔案導致 FileNotFoundException 解決

     編輯:程式設計綜合問答

錯誤現象

java.io.FileNotFoundException: ... upload_xxx.tmp (系統找不到指定的文件)

上傳 < 10KB 圖片時,CommonsMultipartFile.getFileItem() 回傳的 DiskFileItem 找不到臨時檔案。

根本原因

CommonsMultipartResolver 設定 maxInMemorySize=10240 (10KB)。檔案小於此閾值時,僅存於記憶體,不寫入磁碟臨時檔案。程式碼強制轉型 DiskFileItem 並呼叫 getStoreLocation() 導致例外。

解決方案

  1. 降低閾值 (推薦 2KB) 強制小檔案也寫磁碟:
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxInMemorySize" value="2048" /> <!-- 2KB -->
    </bean>
    
  2. 程式碼相容記憶體/磁碟兩種模式:
    CommonsMultipartFile cf = (CommonsMultipartFile) upload;
    DiskFileItem fi = (DiskFileItem) cf.getFileItem();
    File srcFile;
    if (fi.isInMemory()) {
        // 記憶體模式:手動寫入臨時檔
        srcFile = File.createTempFile("upload_", ".tmp");
        try (FileOutputStream fos = new FileOutputStream(srcFile)) {
            fi.write(fos);
        }
    } else {
        srcFile = fi.getStoreLocation(); // 磁碟模式
    }
    RemoteFileUtil.copyImage(srcFile, newFileName);
    
  3. 遷移至 StandardServletMultipartResolver (Spring 3.1+ / Servlet 3.0):無需 Commons FileUpload 依賴,支援 @MultipartConfig 原生配置。
    <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
    
    在 Servlet 加 @MultipartConfig(maxFileSize=1024000, maxRequestSize=2048000, fileSizeThreshold=2048)。

配置對照表

屬性CommonsMultipartResolverStandardServletMultipartResolver
臨時檔閾值maxInMemorySizefileSizeThreshold (Servlet 註解)
最大單檔maxUploadSizemaxFileSize
最大總請求maxUploadSizemaxRequestSize

最佳實務

  • 生產環境建議 fileSizeThreshold=2048 避免大量小檔案佔用記憶體。
  • 上傳完成後及時刪除臨時檔 (fi.delete())。
  • 使用 MultipartFile.transferTo(destFile) 統一 API,框架自動處理記憶體/磁碟轉存。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved