Spring批量打开MultipartFile,错误:'读者是严格的'模式'

时间:2018-04-26 05:01:23

标签: java spring spring-boot spring-batch

我从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();

都失败并给出了同样的错误。

1 个答案:

答案 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将上传的内容写入临时文件。记得在完成后删除临时文件。