AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Standardkonforme GZ-Datei erstellen

Ein Thema von Codehunter · begonnen am 22. Mai 2006 · letzter Beitrag vom 24. Mai 2006
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Standardkonforme GZ-Datei erstellen

  Alt 22. Mai 2006, 22:46
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.
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#2

Re: Standardkonforme GZ-Datei erstellen

  Alt 22. Mai 2006, 23:12
schau dir mal den RFC 1952 an... vermutlich hapert es am fehlenden Header...
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Standardkonforme GZ-Datei erstellen

  Alt 22. Mai 2006, 23:15
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.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Standardkonforme GZ-Datei erstellen

  Alt 23. Mai 2006, 07:19
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
Klaus
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Standardkonforme GZ-Datei erstellen

  Alt 23. Mai 2006, 07:40
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? )
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Standardkonforme GZ-Datei erstellen

  Alt 23. Mai 2006, 12:32
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 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?
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#7

Re: Standardkonforme GZ-Datei erstellen

  Alt 23. Mai 2006, 12:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Standardkonforme GZ-Datei erstellen

  Alt 24. Mai 2006, 11:51
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?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 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