時(shí)間:2020.12.4
異常:java.io.FileNotFoundException: /home/jdp/apache-tomcat-8.5.54-8-group/apache-tomcat-8.5.54-80/work/Catalina/localhost/ROOT/upload_cda0de04_fa66_4589_8170_5cb0cb7f8152_00000005.tmp
初步判斷:文件上傳路徑問題,但是項(xiàng)目路徑中并未配置這個(gè)路徑谬盐,后面了解到 /work 是tomcat 編譯文件的臨時(shí)路徑恤左,聯(lián)想到 /work 之后的文件可能是上傳的臨時(shí)文件路徑斋否,而前面的路徑是tomcat的絕對路徑
探索1:項(xiàng)目配置的文件路徑為/home/temp, 可能是因?yàn)閠omcat的臨時(shí)文件路徑和我們上傳的臨時(shí)文件路徑不匹配導(dǎo)致的
嘗試1:設(shè)置tomcat 臨時(shí)文件路徑 在 application.properites 中配置 增加配置 server.tomcat.basedir=/home/temp
結(jié)果1:未解決,報(bào)錯(cuò)不變
探索2:查閱資料得知 MultipartFile.transferTo(targetFile) 方法是面向絕對路徑的痒玩,如果入?yún)⑹且粋€(gè)相對路徑,則會(huì)在路徑之前加上 一個(gè)系統(tǒng)絕對路徑(比較符合我們的情況)
嘗試2:根據(jù)文章所述:增加配置類 指定臨時(shí)文件的路徑
@Configuration
public class FileUploadConfig {
?
? ? @Value("${file.temp.root}")
? ? private String FILE_TEMP_ROOT;
?
? ? /**
? ? * 文件上傳配置
? ? *
? ? * @return MultipartConfigElement
? ? */
? ? @Bean
? ? public MultipartConfigElement multipartConfigElement(
? ? ? ? ? ? @Value("${multipart.maxFileSize}") String maxFileSize,
? ? ? ? ? ? @Value("${multipart.maxRequestSize}") String maxRequestSize) {
? ? ? ? MultipartConfigFactory factory = new MultipartConfigFactory();
? ? ? ? // 單個(gè)文件最大
? ? ? ? factory.setMaxFileSize(maxFileSize);
? ? ? ? // 設(shè)置總上傳數(shù)據(jù)總大小
? ? ? ? factory.setMaxRequestSize(maxRequestSize);
? ? ? ? //上傳臨時(shí)路徑
? ? ? ? File file = new File(FILE_TEMP_ROOT);
? ? ? ? if (!file.exists()) {
? ? ? ? ? ? file.mkdirs();
? ? ? ? }
? ? ? ? factory.setLocation(FILE_TEMP_ROOT);
? ? ? ? return factory.createMultipartConfig();
? ? }
}
結(jié)果2:報(bào)錯(cuò)發(fā)生變化,變成了我們的指定的路徑加上 臨時(shí)文件名俏险,但是依舊未能解決問題
java.io.FileNotFoundException: /home/temp/upload_a8eb4246_470f_4f73_81af_891f1ad6651b_00000002.tmp
轉(zhuǎn)換思路:既然是transferTo()方法的問題,換一個(gè)方法
探索3:更換transferTo()方法扬绪,使用 FileUtils.copyInputStreamToFile(sourceFile.getInputStream(), targetFile);方法
嘗試3:尋找方法中包涵的transfTo()方法竖独,替換成FileUtils.copyInputStreamToFile(sourceFile.getInputStream(), targetFile);
結(jié)果3:問題解決
總結(jié):transferTo()在windows 系統(tǒng)上并沒有這個(gè)問題,在Linux上出現(xiàn)了這個(gè)問題挤牛,網(wǎng)上的資料各有說法莹痢,目前未找到真正的原因。為了避免這個(gè)問題,統(tǒng)一使用FileUtils.copyInputStreamToFile(sourceFile.getInputStream(), targetFile);方法來復(fù)制文件格二。