Zip-Datei Download fehlerhaft ****

vfl_freak

Premium-User
Guten Morgen,

ich versuche seit gestern, eine ZIP-Datei mit kleinen Textfiles von einem WebServer runterzuladen und die Inhalte (mittels der Klassen "zipFile" und "zipEntry") in die entsprechenden Unterverzeichnisse zu entpacken.

NAch dem Runterladen bekomme ich beim Einlesen der einzelnen zipEntries nur Exceptions (entweder "invalid block type" oder "invalid LOC header") !

Ich habe meinen Code dann in einem kleinen Testclient mit einer lokal vorliegenden ZIP-Datei erfolgreich (!!) getestet !!

Die Datei ist auf dem WebServer mit "EasyZip" (wohl auch "Great, powerful and FREE archiver utility for Windows") erzeugt worden.
Als ich versucht habe, die runtergeladene Datei mit WinRAR zu entpacken, sah ich dann diese Art Fehler:
...
c:\meineZIPDatei.zip: CRC-fehler in Text_nn1.txt. Die Datei ist fehlerhaft.
c:\meineZIPDatei.zip: CRC-fehler in Text_nn2.txt. Die Datei ist fehlerhaft.
c:\meineZIPDatei.zip: CRC-fehler in Text_nn3.txt. Die Datei ist fehlerhaft.
...
c:\meineZIPDatei.zip: das Archiv ist zerstört
...

Sind beide Zipper nicht miteinander kompatibel oder läuft hier beim Runterladen etwas schief?
Ich habe im Web eine Aussage gefunden, dass ggf. der dazwischen geschaltete ProxyServer stören könnte (allerdings ohne zu erklären, was da stört und wie man damit umgehen müsste) ****?:L

Ich hoffe, dass mir hier irgendwer auf die Sprünge helfen kann !
Danke im voraus
Gruß
Klaus


Hier noch der Code, mit dem ich die datei runterlade - hätte ich vielleicht gleich posten sollen, sorry. Das Runterladen von nicht gezippten Datein klappt damit problemlos!

Java:
private static String strWebPath = "http://www.nnn.xyz.de/myDir1/myDir2/"; // anonymisiert
// Datei vom Webserver runterladen
try
{
	theURL = new URL( strFile  );  // strFile enthält 
}
catch( MalformedURLException ex )
{
	ex.printStackTrace();
}
	    
char[] buf = new char[512 * 512];
int iLen = 0;
InputStream in = null;
		    
try 
{
	if( theURL != null )
	{
		in = theURL.openStream();
		BufferedInputStream bufIn = new BufferedInputStream( in );
		int data;
		while( (data = bufIn.read()) != -1 )    
		{
			buf[iLen] = (char)data;
			iLen++;
		}
		bufIn.close();
		in.close();
	}
}
catch( IOException ex ) 
{
	ex.printStackTrace();
}
 
Zuletzt bearbeitet:
Moin

Der Codeteil fürs Rausschreiben der Files wäre auch noch von Vorteil ;)

Ich denke mal, es liegt daran, dass du mit char-arrays arbeitest und nicht mit byte-arrays -> zip's sind eben binaries,...

Gruss
slowy
 
Hier schnell dieser Code!

Java:
// Alle nachfolgenden Aktionen (Textbuffer füllen und ggf. speichern) NUR DANN,
// wenn zuvor ein Text gelesen werden konnte !
if( iLen > 0 )
{
	// Textbuffer in korrekter (eingelesener) Länge füllen
	char[] cTxtBuf = new char[iLen];
	if( iLen > 0 )
	{
		for( int i = 0; i < iLen; i++ )
		{
			cTxtBuf[i] = buf[i];
		}
	}

	// Jetzt soll die Datei im Verzeichnis " strPathRoot" gespeichert werden
    	String sDatei = strPathRoot + "myFile.zip";
    	try
    	{
    		BufferedWriter f = new BufferedWriter( new FileWriter(sDatei) );
    		f.write( new String(cTxtBuf) );
    		f.flush();
    		f.close();
    	}
    	catch( IOException e )
    	{
    		e.printStackTrace();
    	}
	    	
               	    // nachdem nun die neue ZIP-Datei gespeichert wurde, wird sie ins aktuelle Verzeichnis entpackt
                    ZipFile zipFile = null;
		    
                    // Öffnen der ZIP-Datei
		    try
		    {
		       zipFile = new ZipFile( sDatei );
		    }
		    catch(IOException ex)
		    {
		       ex.printStackTrace();
		    }
		    
		    // zuerst prüfen, ob das Unterverzeichnis "myDir" vorhanden ist
		    // und ggf. anlegen
		    boolean bErfolg = true;
		    File fPath = null;
		    String sPfad = ".\\myDir\\";
		    fPath = new File( sPfad );
		    if( !fPath.exists() )
		    {
		    	bErfolg = fPath.mkdirs();
		    }
		    
		    if( bErfolg )
		    {
		    	// dann Verarbeiten aller Einträge in der ZIP-Datei
		    	Enumeration<? extends ZipEntry> enu = zipFile.entries();

		    	// gezippte im ZIP-File liegende Datei einlesen und dann speichern
	    		BufferedInputStream bis = null;
	    		BufferedOutputStream bos = null;

		    	while( enu.hasMoreElements() )
		    	{
		    		ZipEntry zipEntry = enu.nextElement() ;
		    		System.out.println( "Dateiname: " + zipEntry.getName() );
			
		    		try
		    		{
		    			bis = new BufferedInputStream( zipFile.getInputStream( zipEntry ) );
//		    			byte[] buffer = null;
//		    			int iAnz = bis.available();
//		    			if( iAnz > 0 )
//		    			{
//		    				buffer = new byte[iAnz] ;
//		    				bis.read( buffer, 0, iAnz );
//		    			}
		    			
		    			byte[] buffer = new byte[512 * 512];
		    		        int ilen = 0;
		    		        int data;
				 	while( (data = bis.read()) != -1 )    
					{
						buffer[ilen] = (byte)data;
						iLen++;
					}
		    			
			   
		    			// Da 'zipEntry' den Pfad und den Dateinamen der zu speichernden
		    			// Datei enthält, muss nun zuerst der Pfad extrahiert werden, 
		    			// um seine Existenz zu prüfen und ggf. zu erzeugen
		    			boolean bErzeugt = true;
		    			String fileName = zipEntry.getName();
		    			String[] strArr = fileName.split( "/" );
				
		    			String sDateiPfad = sPfad + strArr[0] + "\\";
		    			fPath = new File( sDateiPfad );
		    			if( !fPath.exists() )
		    			{
		    				bErzeugt = fPath.mkdirs();
		    			}
				
		    			if( bErzeugt )
		    			{
		    				// jetzt die eingelesene Datei wegschreiben
		    				bos = new BufferedOutputStream( new FileOutputStream( sPfad + fileName) );
		    				bos.write( buffer, 0, buffer.length );
			        		System.out.println("gespeichert: " + fileName );
		    			}
		    		}
		    		catch(IOException ex)
		    		{
		    			ex.printStackTrace();
		    		}
		    		finally
		    		{
		    			try
		    			{
		    				if( bis != null )
		    				{
		    					bis.close();
		    				}
		    			}
		    			catch(Exception ex)
		    			{
		    				ex.printStackTrace();
		    			}
			   
		    			try
		    			{
		    				if( bos != null )
		    				{
		    					bos.close();
		    				}
		    			}
		    			catch(Exception ex)
		    			{
		    				ex.printStackTrace();
		    			}
		    		} // finally
		    	} //  while( enu.hasMoreElements() )

		    	// jetzt ggf. die Streams schliessen
		    	try
    			{
    				if( bis != null )
    				{
    					bis.close();
    				}
    			}
    			catch(Exception ex)
    			{
    				ex.printStackTrace();
    			}
	   
    			try
    			{
    				if( bos != null )
    				{
    					bos.close();
    				}
    			}
    			catch(Exception ex)
    			{
    				ex.printStackTrace();
    			}
		    	
		    } // if( bErfolg )
		} // if( iLen > 0 )

Ok, mit char und byte magst Du Recht haben, werden das gleich mal testen! Allerdings wundert michdann trotzdem, dass es mit einem lokal liegenden ZIP funktioniert ....

Gruß
Klaus
 
Warum versuchst du nicht mal, eine Datei mal händisch runterzuladen
(mit einem Fremdprogramm) und die zu testen?
Wenns nicht geht muss es wohl am Inhalt liegen.
(in dem Fall kanns nicht schaden, einfach mal mit einem Hexeditor aufmachen
und schaun, obs angemessen binär ausschaut
und nicht etwa irgendwelche textuellen Serverfehler mitschickt).
 
Moin sheel,

habe ich ja (siehe meiner Post)
Ich habe meinen Code dann in einem kleinen Testclient mit einer lokal vorliegenden ZIP-Datei erfolgreich (!!) getestet !!
Ok, mit "lokal vorliegend" meinte ich dieselbe ZIP-Datei, die ich zuvor für diesem Test per "NetOp" (ein "remote control"-Programm von Novell) runtergeladen hatte ....
Diese läßt sich sowohl mit WinZip also auch meinem Testprogrämmel entpacken.

Deswegen ja die Vermutung, dass es doch am Download liegen könnte .... :-(
Gruß
Klaus
 
Ach so.

..zusätzlich zum gesagten char/byte:
Du hast BufferedWriter drin, speicherst Binärzeug in String (!) undund...
Sollte alles etwas binärer werden.
 
Moin,

..zusätzlich zum gesagten char/byte:
Du hast BufferedWriter drin, speicherst Binärzeug in String (!) undund...
Sollte alles etwas binärer werden

Du meinst vermutlich dies hier:
Code:
// Jetzt soll die Datei im Verzeichnis "CFGSTRING_ROOT" gespeichert werden
       String sDatei = strPathRoot + "myZIP.zip";
   	try
	{
    		BufferedWriter f = new BufferedWriter( new FileWriter(sDatei) );
    		f.write( new String(cTxtBuf) );
    		f.flush();
    		f.close();
    	}
hmm, das klingt irgendwie logisch ..... ;-)
Werde es mal mit 'nem BufferedOutputStream versuchen. Hatte den Part von einer anderen Stelle (an der reine textdateien geholt werden) übernommen ...

Gruß
Klaus
 
Zuletzt bearbeitet:
Moin,

leider funktionieren die Links nicht ....

Aber die Größe wird auch nicht das Problem sein, die ZIP-Datei istr derzeit knapp unter 100 kB groß!

Danke und Gruß
Klaus
 
So, es hing in der Tat mit den verwendeten char-Buffern zusammen ....
Nun klappt alles - danke an alle :)

tschüss
Klaus
 

Neue Beiträge

Zurück