У меня проблема, которая возникает, только когда веб-приложение упаковано в WAR и установлено на сервере Tomcat - оно не возникает во время разработки.
Что я делаю:
Я получаю Part
из HttpServletRequest
, который является загруженным файлом:
Part uploadedFile = null;
for(Part part: parts) {
if(part == null)
continue;
if(uploadFieldName.equalsIgnoreCase(part.getName())) {
uploadedFile = part;
break;
}
}
Затем я сохраняю этот объект Part
для дальнейшего использования (оннельзя использовать сразу).Код немного сложен, но по сути сродни:
// List of uploaded files pending
// List declared as:
// protected List<Part> uploadedFiles;
synchronized(this.uploadedFiles) {
this.uploadedFiles.add(uploadedFile);
}
Позже я пытаюсь извлечь файл из другого потока.
// Assume that the method is synchronized
Part reqrievedFile = myUploadService.getFileFromArray();
synchronized(retrievedFile) {
doSomething(retrievedFile.getInputStream());
Наконец, я удаляю файл через 5 минут после использования:
retrievedFile.delete();
При тестировании в Eclipse это работает хорошо, файл доступен, и я могу его обработать.
Но когда эта функция была добавлена в тестовый код и загружена на тестовый сервер Tomcat, тестеры испытывали эту ошибку:
IOException: C: \ apache-tomcat-8.5.34 \ work\ Catalina \ localhost \ Projectname \ upload_9357ad4d_193f_40fc_96d6_b6e4b9e3c82a_00000001.tmp (система не может найти указанный файл)