java - MultiPartFile 删除得太早

标签 java spring spring-mvc file-upload

我正在使用 MultPartFile 从前端上传 .zip,有时在我对其执行任何操作之前,该文件会被删除。 我调试 CommonsMultipartFile.class (intellij) 来清理我的想法,但我找不到任何东西可以解释为什么有时我可以操作 MultPartFile,有时却不能。

在 CommonsMultipartFile.class 中,当他传递 isAvailable() 方法时,File 被删除,当 isAvailable() 尝试验证他是否存在时,返回 false。

这是我的代码

 private void limparDiretorioCargasVXESalvarCarga(MultipartFile arquivoMultipartFile, String caminhoDiretorio, String nomeArquivo) throws Step1Exception {
    try {
        File diretorio = new File(caminhoDiretorio);

        if (!diretorio.exists()) {
            diretorio.mkdirs();
        } else {
            FileUtils.cleanDirectory(diretorio);
        }
        System.out.println("Diretorio: " + diretorio.getPath());
        File file = new File(diretorio.getPath(), nomeArquivo);

        InputStream InputStreamArquivoFile = arquivoMultipartFile.getInputStream();
        File arquivoFileTemp = new File("/var/lib/mysql-files/cargasvx/baixados/"+arquivoMultipartFile.getOriginalFilename());

        OutputStream outputStream = new FileOutputStream(arquivoFileTemp);
        IOUtils.copy(InputStreamArquivoFile, outputStream);
        outputStream.close();

        this.copiarArquivo(arquivoFileTemp,file);

    } catch (Exception e) {
       e.printStackTrace();
    }
}

传入时:

        InputStream InputStreamArquivoFile = arquivoMultipartFile.getInputStream();

该异常是可抛出的。

这是堆栈:

java.lang.IllegalStateException: File has been moved - cannot be read again
at org.springframework.web.multipart.commons.CommonsMultipartFile.getInputStream(CommonsMultipartFile.java:146)
at br.com.sgsistemas.integrador.services.integracao.ImportacaoService.limparDiretorioCargasVXESalvarCarga(ImportacaoService.java:284)
at br.com.sgsistemas.integrador.services.integracao.ImportacaoService.iniciarImportacaoArquivos(ImportacaoService.java:155)
at br.com.sgsistemas.integrador.services.integracao.ImportacaoService$$FastClassBySpringCGLIB$$422ad70a.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684)
at br.com.sgsistemas.integrador.services.integracao.ImportacaoService$$EnhancerBySpringCGLIB$$540126c6.iniciarImportacaoArquivos(<generated>)
at br.com.sgsistemas.integrador.controllers.ImportacaoAPI.lambda$iniciarImportacaoCarga$0(ImportacaoAPI.java:52)
at java.lang.Thread.run(Thread.java:748)

我知道我可以setMaxInMemorySize(),但这不是我搜索的解决方案。我需要将文件保存在某个临时目录中,并在操作它后将其删除。

最佳答案

我不确定您的代码到底出了什么问题,但 MultipartFile 有一个 transferTo 方法,您可以使用它来替换大部分代码。通过减少编写的代码量,您将最大限度地减少出现错误的机会,并且可能会看到您的问题消失......

关于java - MultiPartFile 删除得太早,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52722111/

相关文章:

java - 如何从 Vaadin Flow 应用程序下载 PDF?

java - Spring Boot 不接受括号内的列表参数

java - Spring - 从类路径资源 [Beans.xml] 加载 XML bean 定义 - NoClassDefFoundError

java - RequestMappingHandlerMapping 是 RestController 的截断路径

java - Springboot + MySQL + 找不到驱动类

java - Android 中的基本可点击项目

java - 康威的生命游戏调试 (Java)

java - 将图像插入 JScrollPane 并将 JScrollPane 插入 JFrame

java - 如何以绝对定位将组件添加到 JComponent 中?

使用 try catch block 时的 Spring @Transactional 注释