我正在使用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()
,但这不是我要寻找的解决方案。我需要将文件保存在一些临时目录中,并在对其进行操作后将其删除。
答案 0 :(得分:1)
我不确定您的代码到底出了什么问题,但是MultipartFile有一个transferTo
方法,您可以用它来替换很多代码。通过减少编写的代码量,可以最大程度地减少错误发生的可能性,并且也许可以解决问题……