java .nio.file.NoSuchFileException Когда вызывается File.transferTo () - PullRequest
0 голосов
/ 21 февраля 2020

Я недавно унаследовал Java API и у меня проблемы с загрузкой файлов. К сожалению, Java не является языком, на котором у меня большой опыт, поэтому я немного озадачен этим.

Получается MultiPartFile в порядке, и я могу найти файл в каталоге temp , но когда я пытаюсь использовать File.transferTo () для создания окончательного файла, я просто получаю следующую ошибку:

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

Как я уже упоминал, файл временного отката существует, и каталог на диске S также существует, ( но там нет Temp.xlsx, так как я понимаю, это должно быть создано transferTo()). Любые решения этой проблемы, которые я нашел до сих пор, решаются с использованием абсолютных путей к файлам.

Это упрощенная версия кода, но ошибка остается той же.

SpringBoot framework равен "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();
    }
}

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо, Нил

1 Ответ

1 голос
/ 21 февраля 2020

API для MultipartFile немного сложнее. Метод TransferTo (File) javado c утверждает, что (жирный шрифт мой):

Это может либо переместить файл в файловой системе, либо скопировать файл в файловой системе, либо сохранить содержимое памяти. в файл назначения. Если целевой файл уже существует, он будет удален первым.

Если целевой файл был перемещен в файловой системе, эта операция не может быть вызвана снова после . Поэтому вызовите этот метод только один раз, чтобы работать с любым механизмом хранения.

Кажется, что реализация Undertow уже вызвала его, чтобы переместить загруженный файл в памяти в "C: \ Users \ myUser \ AppData \ Loca \ Temp \ undertow3706399294849267898upload ", поэтому происходит сбой другого TransferTo.

Я столкнулся с той же проблемой, используя javax.servlet.http.Part в контейнере Wildfly с Undertow.

Если вы используете Spring Framework> = 5.1, вы можете попробовать метод Multipart.transferTo (Path), используя dest.toPath()

Или вы можете скопировать из inputStream что-то вроде этого:

try (InputStream is = multipartFile.getInputStream()) {
    Files.copy(is, dest.toPath());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...