簡體   English   中英

上傳多部分文件時出現 FileNotFoundException - Spring boot

[英]FileNotFoundException while uploading multi part file - Spring boot

我正在嘗試通過 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

此問題是間歇性的,我無法通過連續嘗試重新生成它。 同一文件第二次成功上傳。

知道我在這里做錯了什么嗎?

提前致謝

可能有多種原因,sprintboot 默認情況下將 Multipart 文件存儲在某個系統目錄中,一旦您使用 file.getInputStream() 消耗文件,再次執行它會導致它發生。 由於一旦讀取 inputstream,spring 會自動清除保存的文件,從而導致 file not found 異常。 另一個原因是在處理多部分文件時使用 @Async。

我找到了一個非常簡單的方法。 我使用了TaskExecutor (一種多線程方法)。 注意到來自 tomcat 服務器的臨時文件正在被刪除。 因此,我創建了一個 DTO 並從List<MultipartFile>提取了我需要的重要數據:-

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);
            }
        });

然后調用我的 Task Executor 方法。 然后數據按預期反映在新線程中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM