Contents

MultipartFile.transferTo 遇到 FileNotFoundException 問題

Contents

之前公司同事有教,在 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());一行解決,不過寫完整一點會比較好。

參考來源:

分析原因

https://i.imgur.com/maX8QYw.png

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

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