MultiPartFile删除太早

时间:2018-10-09 13:20:25

标签: java spring spring-mvc file-upload

我正在使用MultPartFile从我的前端上载.zip,有时有时会删除此文件,然后再执行任何操作。 我对CommonsMultipartFile.class(intellij)进行了调试,以清理我的想法,但我找不到任何能解释为什么有时可以操纵MultPartFile有时不能操纵的东西。

在CommonsMultipartFile.class中,当文件传递isAvailable()方法并且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(),但这不是我要寻找的解决方案。我需要将文件保存在一些临时目录中,并在对其进行操作后将其删除。

1 个答案:

答案 0 :(得分:1)

我不确定您的代码到底出了什么问题,但是MultipartFile有一个transferTo方法,您可以用它来替换很多代码。通过减少编写的代码量,可以最大程度地减少错误发生的可能性,并且也许可以解决问题……