java.io.FileNotFoundException: ... upload_xxx.tmp (系統找不到指定的文件)
上傳 < 10KB 圖片時,CommonsMultipartFile.getFileItem() 回傳的 DiskFileItem 找不到臨時檔案。
CommonsMultipartResolver 設定 maxInMemorySize=10240 (10KB)。檔案小於此閾值時,僅存於記憶體,不寫入磁碟臨時檔案。程式碼強制轉型 DiskFileItem 並呼叫 getStoreLocation() 導致例外。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxInMemorySize" value="2048" /> <!-- 2KB -->
</bean>
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);
@MultipartConfig 原生配置。
<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
在 Servlet 加 @MultipartConfig(maxFileSize=1024000, maxRequestSize=2048000, fileSizeThreshold=2048)。
| 屬性 | CommonsMultipartResolver | StandardServletMultipartResolver |
|---|---|---|
| 臨時檔閾值 | maxInMemorySize | fileSizeThreshold (Servlet 註解) |
| 最大單檔 | maxUploadSize | maxFileSize |
| 最大總請求 | maxUploadSize | maxRequestSize |
fileSizeThreshold=2048 避免大量小檔案佔用記憶體。fi.delete())。MultipartFile.transferTo(destFile) 統一 API,框架自動處理記憶體/磁碟轉存。