Ich bin gerade dabei, mir ein CGI-Programm für den Apache zu bauen, das SVG-Daten automatisch komprimiert, sprich in SVGZ-Daten umwandelt. Mein Programm öffnet dazu die Datei, die der Apache übertragen will, komprimiert den Inhalt und speichert die komprimierte Datei in einem MemoryStream. Eingabe und Verarbeitung funktioniert, damit die gute Eva aber glücklich ist, fehlt natürlich noch die Ausgabe. Und an der haperts.
Da die komprimierten Daten binär sind, kann ich zum Lesen aus dem Memory-Stream keine Strings benutzen. Also habe ich es mit einem Array of Byte versucht, das den Inhalt des Streams einliest und dann in die Standard-Ausgabe schreibt. Codemäßig sieht das so aus:
Delphi-Quellcode:
var
InputStream: TFileStream;
OutputStream: TMemoryStream;
CompressionStream:
ZLib.TCompressionStream;
buf:
Array of Byte;
a: Integer;
SVGPath:
String;
begin
WriteLn('
Content-type: image/xml-svg');
WriteLn;
SVGPath := GetEnvVar('
PATH_TRANSLATED');
//Dateiname als Apache-Umgebungsvariable
InputStream:=TFileStream.Create(SVGPath, fmOpenRead);
OutputStream:=TMemoryStream.Create;
CompressionStream:=TCompressionStream.Create(clMax, OutputStream);
CompressionStream.CopyFrom(InputStream, InputStream.Size);
CompressionStream.Free;
SetLength(buf,OutputStream.Size);
OutputStream.
Read(buf,OutputStream.Size);
OutputStream.SaveToFile('
c:/test.svgz');
//Datei, um erfolgreiche Komrprimierung zu bestätigen: erfolgreich
for a := 0
to Length(buf) - 1
do write(char(buf[a]));
//hier Ausgabe
OutputStream.Free;
InputStream.Free;
end.
Ausgegeben bekomme ich hier lauter #00. Kann mir einer sagen, warum??