Problem z plikiem ZIP

0

Na wejście moduły który implementuję dostaję paczkę ZIP/JAR. Następnie muszę ją rozpakować. Operacja ta w przypadku aplikacji desktopowej wykonywana jest bez żadnych błędów i wszystko jest ładnie. Problem pojawia się jednak w przypadku aplikacji webowej. Stworzony mam Dynamic Web Project i w katalogu Webcontents umieszczam paczkę ZIP którą chcę rozpakować. Już w momencie wywoływania konstruktora:

JarFile jarFile = new JarFile("Paczka.zip");
(Reszta kodu nie jest ważna, nawet servlet z tą jedną linijka sypie się, także problem tkwi w tym miejscu)

aplikacja wyrzuca mi błąd java.util.zip.ZipException: error in opening zip file. Plik na pewno znajduje się w odpowiednim miejscu, ponieważ mogę go spokojnie wczytać jako zwykły File:

File file = new File("Paczka.zip");

Czy miał ktoś z Was taki problem? Przydatne informacje:
Java 1.6, jre6, Tomcat 5.5, aplikacja rozmieszczana jest na serwerze eatj.com, SO Windows XP Pro.

StackTrace:
java.util.zip.ZipException: error in opening zip file
java.util.zip.ZipFile.open(Native Method)
java.util.zip.ZipFile.<init>(ZipFile.java:114)
java.util.zip.ZipFile.<init>(ZipFile.java:75)
ui.Discoverer.doGet(Discoverer.java:49)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
java.lang.Thread.run(Thread.java:619)

Proszę o pomoc!

0

Wg dokumentacji, konstruktor JarFile(String) sprawdza czy otwierany jarFile jest podpisany. Spróbuj

...=new JarFile("Paczka.zip",false);
//lub
...=new ZipFile("Paczka.zip");
0
bogdans napisał(a)

Wg dokumentacji, konstruktor JarFile(String) sprawdza czy otwierany jarFile jest podpisany. Spróbuj

...=new JarFile("Paczka.zip",false);
//lub
...=new ZipFile("Paczka.zip");

Próbowałem i dalej to samo. Najciekawsze jest to, że w desktopowej aplikacji wszystko ładnie działa, a w webowej tak sie sypie.

0

sproboj dodac cala sciezke i zobacz czy dziala
tzn

new JarFile( sciezka + "Paczka.zip" );
0
gosc napisał(a)

sproboj dodac cala sciezke i zobacz czy dziala
tzn

new JarFile( sciezka + "Paczka.zip" );

Aplikacja jest rozmieszczona na serwerze w serwisie eatj.com. Paczka.zip znajduje się w katalogu WebContent także raczej nie da się ścieżki podać (chyba ze jest to możliwe, to nie wiem jak). W przypadku zwykłego obiektu File konstruktor postaci: new File("Paczka.zip"); działa i niepotrzebna jest ścieżka.

0
skadam napisał(a)
gosc napisał(a)

sproboj dodac cala sciezke i zobacz czy dziala
tzn

new JarFile( sciezka + "Paczka.zip" );

Aplikacja jest rozmieszczona na serwerze w serwisie eatj.com. Paczka.zip znajduje się w katalogu WebContent także raczej nie da się ścieżki podać (chyba ze jest to możliwe, to nie wiem jak). W przypadku zwykłego obiektu File konstruktor postaci: new File("Paczka.zip"); działa i niepotrzebna jest ścieżka.

Okazuje się więc, że pakiet ZipFile (a więc i JarFile) jest niedoskonały i na niektórych maszynach potrafi działać po swojemu, albo nie działać. Można rozpakować plik zip w inny sposob, mianowicie za pomocą ZipInputStream. Zainteresowanych odsyłam na stronę:
http://java.sun.com/developer/technicalArticles/Programming/compression/

Jeśli chodzi natomiast o podawanie ścieżki w przypadku tego drugiego sposobu należy pamiętać o strukturze katalogowej danego serwera. Konstruktor File(filename) owszem znajdzie plik, ale konstruktor FileInputStream(filename) już nie. Jest na to pewien sposób. Należy zbadać jaka jest rzeczywista ścieżka do miejsca w którym aplikacja webowa domyślnie szuka pliku. Można to zrealizować w sposób następujący:

String realPath = this.getServletConfig().getServletContext().getRealPath("/");

Rozwiązanie to znalazłem w tym miejscu:

http://www.velocityreviews.com/forums/t148916-fileinputstream-in-servlet.html

jako odpowiedź użytkownika Rhino.

Mam nadzieję że teraz ktoś z podobnym problemem szybko znajdzie rozwiązanie.
Mi zajęło to prawie dwa dni. Pozdrawiam i dzięki za porady.

1 użytkowników online, w tym zalogowanych: 0, gości: 1