У меня уже работает код для чтения файла Excel.Сначала API в контроллере получает файл как тип MultipartFile.Затем, по некоторым причинам, мне нужно преобразовать MultipartFile в тип файла.Вот код:
private static File convert(MultipartFile file) throws IOException {
try {
File convertedFile = new File(file.getOriginalFilename());
convertedFile.createNewFile();
FileOutputStream fos = new FileOutputStream(convertedFile);
fos.write(file.getBytes());
fos.close();
return convertedFile;
} catch (IOException e) {
e.printStackTrace();
throw new IOException("Error in converting the file with error message: " + e.getMessage());
}
}
Вот класс службы, который вызвал в контроллере, который вызывает метод преобразования выше:
public void create(MultipartFile file) throws Exception {
try {
File newFile = convert(file);
// rest of code
} catch (Exception e) {
// rest of code
}
}
Прежде чем я попытаюсь вызвать службу вновый поток, код выше работает нормально.Но, когда я пытаюсь вызвать службу в новом потоке, как показано ниже, код сообщает java.io.FileNotFoundException (система не может найти указанный файл), и основная проблема заключается в этой строке fos.write(file.getBytes());
.Вот как я создаю новый поток в контроллере:
@RequestMapping(method = RequestMethod.POST, value = "uploadfile")
public ResponseEntity<?> create(@RequestParam (value = "file", required = false) MultipartFile file) throws Exception {
try {
// ...other process
// ================================== code below not work
Thread create;
create = new Thread() {
public void run() {
try {
service.create(file);
} catch (Exception e) {
e.printStackTrace();
}
}
};
create.start();
// ================================== code below not work
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
service.create(file);
} catch (Exception e) {
e.printStackTrace();
}
}
});
t1.start();
// ================================== code below not work
new Thread(() -> {
try {
service.create(file);
} catch (Exception e) {
e.printStackTrace();
}
}){{start();}};
// ...rest of code
} catch (Exception e) {
// ...rest of code
}
}
выше - это несколько способов, как я пытаюсь создать поток, но ни один из них не работает, результат с тем же исполнением.
Цель: Короче говоря, я хочу сделать чтение файла в фоновом режиме и немедленно отправить ответ клиенту после вызова службы.