Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Standardkonforme GZ-Datei erstellen (https://www.delphipraxis.net/69958-standardkonforme-gz-datei-erstellen.html)

Codehunter 22. Mai 2006 22:46


Standardkonforme GZ-Datei erstellen
 
Ich ärgere mich derzeit mit dem Problem herum daß ich mit Delphi eine GZ-Datei erstellen will die dann per HTTP zu einem PHP-Prozessor übertragen wird und dort mit den GZ-Funktionen wieder entpackt werden soll.

Ich benutze TZCompressionStream (ZLib 1.2.4) dazu wie folgt:
Delphi-Quellcode:
var
  FS1, FS2: TFileStream;
  CS: TZCompressionStream;
begin
  FS1:= TFileStream.Create('C:\test.txt', fmOpenRead);
  FS2:= TFileStream.Create('C:\test.gz', fmOpenReadWrite or fmCreate);
  CS:= TZCompressionStream.Create(FS2, zcMax);
  CS.CopyFrom(FS1, FS1.Size);
  CS.Free;
  FS1.Free;
  FS2.Free;
end;
Es wird auch eine Datei test.gz erstellt die "irgendwie" komprimiert ist. Doch übertrage ich die zum PHP kann z.B. readgzfile nichts damit anfangen (entweder "Data Error" oder es wird nur Binärmüll ausgegeben).

Wenn ich z.B. mit WinACE aus der test.txt eine test.gz erstelle und mit den selben Mitteln zum PHP übertrage funktioniert das Ganze.

Scheinbar wird hier keine gültige GZ-Datei erstellt. Was mach ich da falsch?

EDIT: Ich denke ich hab da prinzipiell zwei verschiedene Probleme. Einmal habe ich es schon hinbekommen, mit der Delphi-ZLib einen String zu komprimieren und per Indy zum PHP zu übertragen und dort auch zu dekomprimieren (Als HTTP-Multipart-Form-Data Text-Feld). Nur kommts dummerweise durchaus vor daß der komprimierte String Bytes enthält die Indy und/oder HTTP itself als Steuercodes interpretieren (Zeichen 0 z.B.). Dann wird das ganze durch Backslashes maskiert usw. Das Resultat ist was nicht lesbares für die PHP-ZLIb-Funktionen.

Also das Ziel ist folgendes: Eine größere Menge Bytes (i.d.R. als Stream vorliegend) komprimieren, per Indy übertragen und auf PHP wieder dekomprimieren. Das KANN (muss aber nicht) den Umweg über eine temporäre Datei machen.

Ich such mich im Web und hier im Forum schon fusselig aber meist finde ich nur ähnliche Fragen und keine Antworten mit durchschlagenden Erkenntnissen.

Basilikum 22. Mai 2006 23:12

Re: Standardkonforme GZ-Datei erstellen
 
schau dir mal den RFC 1952 an... vermutlich hapert es am fehlenden Header...

Codehunter 22. Mai 2006 23:15

Re: Standardkonforme GZ-Datei erstellen
 
Danke das hat sich jetzt zwischenzeitlich überschnitten. Ich hab oben noch ein Edit eingefügt. GZ als Datei mit Header wär ja ohnehin nur ne Ausweichlösung gewesen weil ich Streaming-mäßig derzeit auf der Stelle trete.

Klaus01 23. Mai 2006 07:19

Re: Standardkonforme GZ-Datei erstellen
 
Ich kann auch schwer vertun, aber komprimiert ZLib nicht so wie es
das Kommando compress auf Unix/Linux macht. Also die Dateien mit der
Endung .Z und diese sind mit gz nicht zu dekomprimieren.
Gz ist zu zip mehr oder weniger kompatibel.

http://groups.google.de/group/borlan...49ade16ffcda4a

Grüße
Klaus

Daniel 23. Mai 2006 07:40

Re: Standardkonforme GZ-Datei erstellen
 
Die Header sind's vermutlich. ;-)

Siehe auch http://www.delphipraxis.net/internal...=454829#454829.

Du bekommst Daten im ZLIB-Format. Das ist - bis auf eine Handvoll Bytes als Header - identisch mit dem GZ-Format. Wenn Du diesen Header als per Hand einfügst sollte es klappen.

(Oder zur Not ein Edit-Feld auf das Form legen - welcher User hat denn bitteschön nicht den Standard-GZip-Header im Kopf? :stupid: )

Codehunter 23. Mai 2006 12:32

Re: Standardkonforme GZ-Datei erstellen
 
OK ich habs hinbekommen. Die Header waren es komischerweise nicht obwohl mir das auch plausibel erschien. Ich habe einen Denkfehler im PHP gemacht. Ich dachte die Funktionen gzopen und gzread würden die komprimierte Datei öffnen und beim auslesen gleich dekomprimieren. Tun sie aber nicht sondern man muss das zusätzlich mit gzuncompress machen:
Code:
$filename = $_FILES['http_form_file_field']['tmp_name'];
$zd = gzopen($filename, "r");
$contents = gzread($zd, 10000);
gzclose($zd);
echo gzuncompress($contents);
Zwar erschließt sich mir der Sinn dedizierter gz*-Funktionen nicht wenn die prinzipiell nichts anderes tun als fopen und fread aber es kann ja sein daß die gz*-Funktionen grad die gz-Header entfernen die die Delphi-ZLib gar nicht erst erstellt :D Und da stellt sich gleich die nächste Frage: Wozu haben gz-Dateien überhaupt einen Header wenn die ZLib auch ohne auskommt? Fragen über Fragen...

Naja jetzt bin ich erstmal zufrieden und kann meine XML-Daten komprimiert übertragen. Da anscheinend öfters jemand über das Problem stolpert schreib ich evtl. ein Tutorial. Da ich relativ neu bei euch bin: Wie läuft das denn hier mit den Tutos?

Frickeldrecktuxer_TM 23. Mai 2006 12:50

Re: Standardkonforme GZ-Datei erstellen
 
Zitat:

Zitat von Codehunter
Und da stellt sich gleich die nächste Frage: Wozu haben gz-Dateien überhaupt einen Header wenn die ZLib auch ohne auskommt?

Die zlib komprimiert, gzip komprimiert Dateien ;-)
Schau dir oben genanntes RFC mal an, dann weißt du, welche Informationen im Header stehen. Dazu gehört beispielsweise den ursprünglichen Dateinamen, einen Zeitstempel für die gepackte Datei, das verwendete Komprimierungsverfahren, CRC-Quersummen und andere Informationen. Die sind nicht notwendig, wenn man irgendwas komprimieren will, aber hilfreich, wenn man Dateien komprimieren will. Deswegen ist auch zlib nicht gleich gzip.

Codehunter 24. Mai 2006 11:51

Re: Standardkonforme GZ-Datei erstellen
 
Ok das leuchtet ein. Ich befasse mich zum ersten Mal mit der ZLib. Hab zwar früher mal mit TZipMaster zu tun gehabt aber da gibts ja kaum bis gar keine passenden Pendants auf der PHP-Seite.

Soweit ich gzip inzwischen verstehe ist das technisch nur in der Lage, eine einzige Datei zu komprimieren. Will man mehr muss man das vorher mit tar zusammenstellen. Zwar brauche ich es nicht aber rein interessenhalber: Ist euch eine Bibliothek, VCL-Kompo o.Ä. bekannt die tar für Delphi bereitstellt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz