[英]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.