我已经有一个能读取excel文件的代码。首先,控制器案例中的API将文件接收为MultipartFile类型。然后,由于某些原因,我需要将MultipartFile转换为File类型。这是代码:
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());
}
}
这是在控制器中调用的服务类,它调用了上面的convert方法:
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
}
}
上面的是我尝试制作线程的几种方法,但是它们都不起作用,执行相同的结果。
目标:总而言之,我想让文件在后台读取,并在调用服务后立即将响应发送给客户端。
答案 0 :(得分:0)
Spring通过返回一个Callable对象来支持异步方式。伪代码就像:
@RequestMapping(method = RequestMethod.POST, value = "uploadfile")
public Callable<ResponseEntity<?>> create(@RequestParam (value = "file", required = false) MultipartFile file) throws Exception {
return () -> {
try {
service.create(file);
return ResponseEntity.ok()
} catch (Exception e) {
return ResponseEntity.error( /*some error*/
e.printStackTrace();
}
};
}