程式狂想筆記

一個攻城師奮鬥史

0%

MultipartFile.transferTo 遇到 FileNotFoundException 問題

之前公司同事有教,在 Window 在專案 D 朝設定 /app/file(參照位置),執行時候就會吃D:/app/file。這個非常實用,不需要再重新配置。

但在用 Spring Boot 會發生讀不到檔案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
public String store(MultipartFile file, String fileName) throws IOException {

String destPath "/app/file/";
File filePath = new File(destPath);
File dest = new File(filePath, fileName);
if (!filePath.exists()) {
filePath.mkdirs();
}
try {
file.transferTo(dest);
log.info("file save success");
} catch (IOException e) {
log.error("File upload Error: ", e);
throw e;
}
return dest.getCanonicalPath();
}

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
public String store(MultipartFile file, String fileName) throws IOException {

String destPath "/app/file/";
File filePath = new File(destPath);

// Convert to absolute path
File dest = new File(filePath.getAbsolutePath(), fileName);
if (!filePath.exists()) {
filePath.mkdirs();
}
try {
file.transferTo(dest);
log.info("file save success");
} catch (IOException e) {
log.error("File upload Error: ", e);
throw e;
}
return dest.getCanonicalPath();
}

重點是在File dest = new File(filePath.getAbsolutePath(), fileName);

也可以file.transferTo(filePath.getAbsoluteFile());一行解決,不過寫完整一點會比較好。

參考來源:

分析原因

參考來源:
一次突如其来的FileNotFoundException – 大狗小窝

因為 file.isAbsolute() 原因會補上location絕對位置,會造成抓出路徑錯誤位置。