PDA

View Full Version : zippen über Java



flieger_siggi
26-06-13, 12:32
Mahlzeit,

ich zippe in einer Javaklasse, die auf der i5 läuft eine Datei.
Dann versuche ich, diese Datei aus dem Archiv wieder zu entpacken (winzip bzw. 7Z). Das funktioniert aber nicht!
Winzip sagt beschädigter Header, 7z zeigt zwar das Inhaltsverzeichnis, meckert dann aber beim Entpacken:"das Kompressionsverfahren wird nicht unterstützt".
Kennt jemand so ein Problem? Liegt das daran, dass hier die i5 im Spiel ist?

Grüße
Siggi

@all
Hat sich erledigt, hab den Fehler. Im ZipEntry musste die Methode noch
explizit gesetzt werden.

Fuerchau
26-06-13, 12:46
Nö, ggf. wieder mal an der CCSID der Ausgabedatei.
Steht diese mal wieder auf z.B. 273 wird von Java in EBCDIC konvertiert, auch eine ANSI-Kodierung wäre denkbar.

Wichtig beim Zippen ist jedoch, dass die Ausgabe "binär" erfolgt, also ohne jedwede Codewandlung beim Schreiben.
Ggf. machst du hier was falsch.

flieger_siggi
26-06-13, 19:38
Hallo,

nein, das ist nicht das Problem.
Ich konnte es inzwischen identifizieren: ich versende Daten per FTP über Java. Hierbei wird nun die .zip Datei geschreddert. Vor dem Versenden ist noch alles in Ordnung. Jetzt suche ich gerade den Grund dafür. Als FTP Client nutze ich apache.commons.net 3.3.
Wenn ich mich aber an die dortigen Empfehlungen halte, funktioniert es leider nicht wie gewünscht. Ich denke, es liegt an der Sendeart oder am verwendeten Filetype.
Vielleicht hat da noch jemand eine Idee??

Grüße
Siggi

Fuerchau
27-06-13, 07:02
Bist du sicher, dass du explizit im Binärmodus sendest?

flieger_siggi
01-07-13, 09:12
moin,

nein, leider habe ich es noch nicht geschafft, die apche Klasse dazu zu überreden, in den Binärmodus zu wechseln.
So funktioniert's jedenfalls nicht:

FTPClient ftp = new FTPClient();
ftp.connect(ziel (ftp://ftp.connect(ziel));
ftp.login(ftpuser (ftp://ftp.login(ftpuser), ftppasswd);
ftp.enterLocalPassiveMode (ftp://ftp.enterLocalPassiveMode)();
if(isBinaryFile){
ftp.setFileType(FTP.BINARY_FILE_TYPE (ftp://ftp.setFileType(FTP.BINARY_FILE_TYPE));
}
else{
ftp.setFileType(FTP.ASCII_FILE_TYPE (ftp://ftp.setFileType(FTP.ASCII_FILE_TYPE));
}
ftp.storeFile(f.getName (ftp://ftp.storeFile(f.getName)(), fis);
Was ist falsch daran???

Fuerchau
01-07-13, 10:01
Vielleicht klappt ja deine Methode "isBinaryFile" nicht korrekt und erkennt die zip als Text.

Ergänze die Prüfung doch auf "EndWith(".zip")" oder so ähnlich.

flieger_siggi
01-07-13, 10:29
nö, die Erkennung an dieser Stelle funktioniert. Wenn ich aber dann einen ftp.getReplyString (ftp://ftp.getReplyString)() absetze nach dem ftp.setFileType (ftp://ftp.setFileType)(), erhalte ich immer den Texthinweis auf einen Ascii Dateityp. Ich suche da noch....

Fuerchau
01-07-13, 11:55
Vielleicht hilft dir ja das:
java - Transfer raw binary with apache commons-net FTPClient? - Stack Overflow (http://stackoverflow.com/questions/3145768/transfer-raw-binary-with-apache-commons-net-ftpclient)