簡體   English   中英

java.nio.file.NoSuchFileException 當 File.transferTo() 被調用時

[英]java.nio.file.NoSuchFileException When File.transferTo() is called

我最近繼承了一個 Java API,但在上傳文件時遇到了問題。 不幸的是,Java 不是一種我有很多經驗的語言,所以我對此感到有些困惑。

MultiPartFile接收正常,我可以在臨時目錄中找到該文件,但是當我嘗試使用 File.transferTo() 創建最終文件時,我只會收到以下錯誤;

java.nio.file.NoSuchFileException: C:\\Users\\myUser\\AppData\\Local\\Temp\\undertow3706399294849267898upload -> S:\\Dev\\PolicyData\\Temp.xlsx

正如我提到的 temp undertow 文件存在,並且 S 驅動器上的目錄也存在,(但沒有 Temp.xlsx,因為我的理解是這應該由transferTo()創建)。 到目前為止,我找到的任何解決方案都是使用絕對文件路徑解決的。

這是代碼的簡化版本,但錯誤保持不變。

SpringBoot 框架為“1.5.3.RELEASE”,運行 Java 1.8.0_131

    ResponseEntity handleFileUpload(@RequestPart(name = "file") MultipartFile file, @PathVariable Long stageFileTypeId) {
    if (!file.isEmpty()) {
        try {
            String filePath = "S:\\Dev\\PolicyData\\Temp.xlsx";
            log.info("Upload Path = {}", filePath);

            File dest = new File(filePath);
            file.transferTo(dest);

            return ResponseUtil.wrapOrNotFound(Optional.ofNullable(filePath));
        }
        catch (Exception ex) {
            log.error("An error has occurred uploading the file", ex);
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }
    else {
        log.error("An error has occurred, no file was received");
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
    }
}

如果您需要更多信息,請告訴我。

謝謝,尼爾

MultipartFile 的 API 有點棘手。 transferTo(File) 方法 javadoc 指出(粗體是我的):

這可能會移動文件系統中的文件,復制文件系統中的文件,或者將內存中的內容保存到目標文件中。 如果目標文件已經存在,則首先將其刪除。

如果目標文件已在文件系統中移動,則此操作之后無法再次調用 因此,只需調用一次此方法即可使用任何存儲機制。

似乎 Undertow 實現已經調用它將內存中上傳的文件移動到“C:\\Users\\myUser\\AppData\\Loca\\Temp\\undertow3706399294849267898upload”,因此另一個 transferTo 失敗。

我在帶有 Undertow 的 Wildfly 容器中使用 javax.servlet.http.Part 遇到了同樣的問題。

如果您使用的是 Spring 框架 >= 5.1,您可以嘗試 Multipart.transferTo(Path) 方法,使用dest.toPath()

或者您可以從 inputStream 復制,如下所示:

try (InputStream is = multipartFile.getInputStream()) {
    Files.copy(is, dest.toPath());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM