上传多部分文件时出现FileNotFoundException - Spring启动

时间:2015-06-09 17:09:52

标签: java file-upload spring-boot multipart

我正在尝试通过Spring部分上传spring boot应用程序来上传文件。在上传文件时,jetty会抛出FileNotFound异常。

以下是模型结构:

private String identifier;
private MultipartFile file;

以下是配置:

@Bean
public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setMaxFileSize("500MB");
    factory.setMaxRequestSize("500MB");
    return factory.createMultipartConfig();
}

@Bean
public CommonsMultipartResolver multipartResolver() {
    return new CommonsMultipartResolver();
}

以下调用抛出异常:

model.getFile().getInputStream()

下面是堆栈跟踪:

java.io.FileNotFoundException: /tmp/MultiPart7953817223010764667 (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    at org.eclipse.jetty.util.MultiPartInputStream$MultiPart.getInputStream(MultiPartInputStream.java:218)
    at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.getInputStream(StandardMultipartHttpServletRequest.java:253)
//user classes

此问题是间歇性的,我无法通过连续尝试重新生成它。第二次成功上传同一个文件。

知道我在这里做错了吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

可能有多种原因,默认情况下sprintboot将Multipart文件存储在某个系统目录中,一旦使用file.getInputStream()使用文件,再次执行该操作将导致该情况发生。 读取输入流后,spring会自动清除保存的文件,从而导致找不到文件异常。 另一个原因是在处理多部分文件时使用@Async。

答案 1 :(得分:0)

我找到了一种非常简单的方法。我使用了 TaskExecutor (一种多线程方法)。注意,来自tomcat服务器的临时文件已被删除。因此,我创建了一个DTO并从需要的List<FileDataDTO> files = new ArrayList<>(); attachments.forEach(attach -> { try { FileDataDTO file = new FileDataDTO(); file.setFileData(attach.getBytes()); file.setOriginalName(attach.getOriginalFilename()); file.setContentType(attach.getContentType()); files.add(file); } catch (Exception e) { logger.error(Constant.EXCEPTION, e); } }); 中提取了重要数据:-

{{1}}

然后调用我的Task Executor方法。然后,数据将按预期方式反映在新线程中。