2016-03-29 7 views
1

Kopieren Sie Dateien aus einem Zipfile-Unterordner in einen anderen Zipfile-Unterordner. version und folder sind Unterordner, die vom Frontend kommen.java.util.zip.ZipException: ungültige Eingabe komprimierte Größe (erwartet 449, aber 455 Byte)

public String restore(String jobId, String version, String folder) { 
    String fileName = String.valueOf(jobId) + ".zip"; 
    String versions[] = version.replaceAll("'", "") 
     .replace("[", "") 
     .replace("]", "") 
     .split(","); 
    String folders[] = folder.replaceAll("'", "").replace("[", "").replace("]", "").split(","); 
    ArrayList<String> listofVersion, listofFolder = new ArrayList<>(); 

    File destinationFile = new File(env.getProperty("file.path") + fileName); 
    File sourceFile = new File(env.getProperty("file.arcivePath") + fileName); 

    FileInputStream in; 
    FileOutputStream out; 
    ZipInputStream zin; 
    ZipOutputStream zipout; 
    int BUFFER = (int) sourceFile.length(); 

    if (!destinationFile.exists()) { 
     try { 
      out = new FileOutputStream(destinationFile); 
      zipout = new ZipOutputStream(out); //I get the "out" object from the servlet which tells the content type and and final zip file location. 
      ZipEntry zEntry, ze; 
      in = new FileInputStream(sourceFile); 
      zin = new ZipInputStream(in); 
      while ((zEntry = zin.getNextEntry()) != null) { 
       System.out.println(zEntry); 
       String entry = zEntry.getName(); 
       String entryList[] = entry.split("/"); 
       if (zEntry.isDirectory() && (entryList.length <= 1)) { 
        zipout.putNextEntry(zEntry); 
       } else { 
        if (entryList.length >= 2) { 
         listofVersion = listVersionRestore(fileName); 
         for (int j = 0; j < versions.length; j++) { 
          for (int i = 0; i < listofVersion.size(); i++) { 
           if (listofVersion.get(i).equals(versions[j])) { 
            if ((entryList.length == 2) && entryList[1].equals(versions[j])) { 
             zipout.putNextEntry(zEntry); 
            } 
            if (entryList.length >= 3) { 
             listofFolder = listFolderRestore(fileName, versions[j]); 
             for (int l = 0; l < folders.length; l++) { 
              for (int k = 0; k < listofFolder.size(); k++) { 
               if (listofFolder.get(k).equals(folders[l])) { 
                if ((entryList.length == 3) && entryList[1].equals(versions[j]) && entryList[2].equals(folders[l])) { 
                 zipout.putNextEntry(zEntry); 
                } 

                if ((entryList.length == 4) && entryList[1].equals(versions[j]) && entryList[2].equals(folders[l])) { 
                 zipout.putNextEntry(zEntry); 
                 byte[] buffer = new byte[BUFFER]; 
                 int len = 0; 
                 while ((len = zin.read(buffer)) != -1) { 
                  zipout.write(buffer, 0, len); 
                 } 

                 zipout.closeEntry(); 
                 in.close(); 
                } 

               } 
              } 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
      zipout.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return "Error"; 
     } 
    } else { 
     return "Already Exists"; 
    } 
    return "RestoredSuccessfully"; 
} 

Erste Fehler wie folgt:

java.util.zip.ZipException: invalid entry compressed size (expected 449 but got 455 bytes) 
at java.util.zip.ZipOutputStream.closeEntry(Unknown Source) 
at prj.iopo.filesystem.FileSystemHandler.restore(FileSystemHandler.java:148) 
at prj.iopo.filesystem.FileSystemHandler$$FastClassBySpringCGLIB$$f51baf3f.invoke(<generated>) 
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
at prj.iopo.filesystem.FileSystemHandler$$EnhancerBySpringCGLIB$$6d76d700.restore(<generated>) 
at prj.iopo.controller.JobController.restore(JobController.java:99) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122)89765042/1/2l/FS-restore.txt 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:213) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Unknown Source) 

Ich erhalte einen Fehler bei zipout.closeEntry(); Aber ich diese Zeile nicht entfernen können.

Antwort

1

Sie müssen ein neues Objekt ZEntry erstellen, um den ZIP-Ausgabestream hinzuzufügen. Sie können einen aus einem ZIP-Eingabestream nicht wiederverwenden: Er enthält Inhalte, die der ZIP-Ausgabestream für sich selbst bestimmen möchte. Verwenden Sie den entsprechenden Konstruktor, um zu kopieren, was wirklich von der Quelle ZIPEntry benötigt wird.

+0

Können Sie eine beliebige Codebeispiel. Ich habe meinen Code wie folgt geändert, aber ich bekomme denselben Fehler. zEntry = zin.getNextEntry(); ze = neuer ZipEntry (zEntry); zipout.putNextEntry (ze); – john

0

Vielleicht die einfachste Lösung TrueZip (https://truezip.java.net/) ist, finden Sie in diesem Thread Appending files to a zip file with Java

EJP ist richtig. Für das Kopieren von Dateien im gleichen Archiv benötigen Sie zwei ZipEntry Objekte, weil jedes ZipEntry Objekt eine Datei oder ein Verzeichnis in dem zip-Archiv stellt

Siehe diesen Thread Reading text files in a zip archive und diesen Link http://www.java2s.com/Code/Java/File-Input-Output/ReadingtheContentsofaZIPFile.htm

Sie benötigen ein ZipFile Objekt, auf das Sie weitergeben die Lage Pfad Ihrer Zip-Datei

ZipFile zf = new ZipFile("/<path>/yourZip.zip");

Dann erstellen Sie eine Aufzählung aller Elemente des ZipFile Objekt

Enumeration entries = zf.entries();

Da Sie die Dateien im Archiv kopieren möchten, können Sie dies überspringen.

Eine alternative Methode ist [ Um den Inhalt der Einträge verwenden, um ein Inputstream (binär in ASCII) gewickelt in eine BufferedReader (liest eine Textdatei, mit Formatierungszeichen wie EOL oder EOF) BufferedReader br = new BufferedReader(new InputStreamReader(input, "UTF-8"));zu lesen] ZipInputStream/ZipOutputStream

der folgende Code liest den Inhalt eines Zip-Archiv (http://www.java2s.com/Code/Java/File-Input-Output/ReadingtheContentsofaZIPFile.htm):

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Enumeration; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipFile; 

public class ReadZip { 
    public static void main(String args[]) { 
    try { 
     ZipFile zf = new ZipFile("ReadZip.zip"); 
     Enumeration entries = zf.entries(); 

     BufferedReader input = new BufferedReader(new InputStreamReader(
      System.in)); 
     while (entries.hasMoreElements()) { 
     ZipEntry ze = (ZipEntry) entries.nextElement(); 
     System.out.println("Read " + ze.getName() + "?"); 
     String inputLine = input.readLine(); 
     if (inputLine.equalsIgnoreCase("yes")) { 
      long size = ze.getSize(); 
      if (size > 0) { 
      System.out.println("Length is " + size); 
      BufferedReader br = new BufferedReader(
       new InputStreamReader(zf.getInputStream(ze))); 
      String line; 
      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
      } 
      br.close(); 
      } 
     } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 
3

von uns gelöst Fehler neuen Stream mit neuem Zipentry.

loc_ze = new ZipEntry(zEntry.getName()); 
zipout.putNextEntry(loc_ze); 
zipfile = new ZipFile(sourceFile); 
InputStream stream = zipfile.getInputStream(zEntry); 
while ((len = stream.read(b)) != -1) { 
    zipout.write(b, 0, len); 
} 
0
static copyZip() throws IOException { 
    try (final ZipInputStream zis = new ZipInputStream(...); 
     final ZipOutputStream zos = new ZipOutputStream(...) 
    ) { 
     copyZipContent(zis, zos); 
    } 
} 

static void copyZipContent(final ZipInputStream zis, final ZipOutputStream zos) throws IOException { 
    ZipEntry zisEntry; 
    while ((zisEntry = zis.getNextEntry()) != null) { 
     ZipEntry zosEntry = new ZipEntry(zisEntry.getName()); 
     zosEntry.setComment(zisEntry.getComment()); 
     zosEntry.setExtra(zisEntry.getExtra()); 
     zos.putNextEntry(zosEntry); 
     IOUtils.copy(zis, zos); 
     zos.closeEntry(); 
    } 
    zos.finish(); 
} 
Verwandte Themen