我从html前端上传了一个批处理文件。
在我的控制器中,我正在尝试处理它
public @ResponseBody void customerBatchUpload(@RequestParam("batchFile") MultipartFile[] batchFile) throws Exception {
File fileToImport = new File(batchFile[0].getOriginalFilename());
String pathToFile = fileToImport.getAbsolutePath();
FlatFileItemReader<Customer> reader = new FlatFileItemReader<>();
reader.setResource(new FileSystemResource(pathToFile));
reader.open(new ExecutionContext());
}
在上面的代码中,行reader.open(new ExecutionContext());
抛出错误
java.lang.IllegalStateException: Input resource must exist (reader is in 'strict' mode): file [C:\Users\user\Desktop\criticialTest5.csv]
at org.springframework.batch.item.file.FlatFileItemReader.doOpen(FlatFileItemReader.java:251)
我试过尝试了String pathToFile = "file://"+ fileToImport.getAbsolutePath();
和
String pathToFile = "file:\\"+ fileToImport.getAbsolutePath();
都失败并给出了同样的错误。
答案 0 :(得分:0)
String getOriginalFilename()
的Javadoc:
在客户端的文件系统中返回原始文件名。
您的服务器无法访问客户端文件系统。怎么可能呢?
您需要拨打byte[] getBytes()
,InputStream getInputStream()
或transferTo(File dest)
,才能访问上传的文件内容。
在您的情况下,使用InputStreamResource
可能是最佳选择:
try (InputStream in = batchFile[0].getInputStream()) {
FlatFileItemReader<Customer> reader = new FlatFileItemReader<>();
reader.setResource(new InputStreamResource(in));
reader.open(new ExecutionContext());
// more code here
}
如果这不起作用,并且上传的文件大小有限,您可以使用getBytes()
和ByteArrayResource
。
如果内存非常宝贵,或者您需要处理大量文件,请使用transferTo(file)
和FileSystemResource
将上传的内容写入临时文件。记得在完成后删除临时文件。