PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ZIP-Datei ordnungsgemäß mit PHP erstellen?


mf_2
2006-06-19, 15:04:37
Hallo,

Ich habe über diesen Link ( http://www.zend.com/codex.php?id=696&single=1 ) eine Möglichkeit gefunden, zip-Archive on-the-fly zu erstellen und dem User gleich zum Download anzubieten. Ich habe den Code und das Beispiel weiter unten so übernommen, dass er mir die Datei sofort zum Download anbietet und nicht erst zwischenspeichert. So weit so gut. Leider wollte das Script beim ersten Mal ned laufen, da habe ich immer einen UNEXPECTED_T_STRING in Zeil 45 bekommen.
Die Problemzeile ist folgende:

$name = str_replace("\", "/", $name);

Ersetze ich diese Zeile wie folgt:


$name = str_replace("\\", "/", $name);
dann läuft es fehlerfrei. Zumindest was den PHP-Teil angeht. Will ich nun die ZIP-Datei öffnen, meldet mir WinRAR ein beschädigtes Archiv. Liegt das an meiner Modifikation?
Oder daran:
Ich weiss leider ned genau, wie man die Datei, die in das ZIP-Archiv soll am besten einliest, folgender Scriptteil ist der dafür relevante:



<?php

$zipfile = new zipfile();

// add the subdirectory ... important!
$zipfile -> add_dir("dir/");

// add the binary data stored in the string 'filedata'
$filedata = "(read your file into $filedata)";
$zipfile -> add_file($filedata, "dir/file.txt");

// the next three lines force an immediate download of the zip file:
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=test.zip");
echo $zipfile -> file();

?>



Was muss ich bei add_dir eintragen? Kann ich das so lassen? ich will ja erstmal kein Verzeichnis machen, sondern nur eine einzelne Datei ins ZIP-Archiv speichern.
Die Zeile
$filedata = "(read your file into $filedata)";
habe ich wie folgt geändert:
$filedata = file_get_contents("mail.bmp");

Ist das die richtige funktion ( file_get_contents )? Bin mir ned sicher, da dazu nichts auf der Website stand. Die Datei "mail.bmp" liegt übrigens im gleichen Verzeichnis wie das Script. Wenn ich statt file_get_contents() nur file() verwende bekomme ich gleich unter PHP bereits einen Fehler.
Hilfe! Ich bin am Verzweifeln!

mf_2
2006-06-19, 18:24:20
Habs jetzt mal mit ner Textdatei statt ner Grafik versucht, immer noch kein Erfolg.
file_get_contents() *müsste* stimmen, da ich diese Funktion mal seperat ausprobiert habe und dann den Variableninhalt mit echo ausgegeben habe und da stand genau der Inhalt der Textdatei.
Ich verzweifel hier echt noch ....

Sephiroth
2006-06-19, 18:57:56
Also die Änderung bei $name = str_replace("\", "/", $name); muß auf alle Fälle rein! ich frag mich gerade wie das beim ihm geklappt haben konnte. X-D

file_get_contents() ist IMO auch richtig.

Ein Verzeichnis im Sinne eines Ordners muß eigentlich nicht zwingend angelegt werden. aber der Code ist vielleicht darauf ausgelegt?

Hast du mal eine Beispiel Datei (beides, ZIP und normal)? Würde mir das Resultat einfach mal gerne angucken ;D

edit #2:
kann es sein das vor dem x bei den hex-werten auch ein \ stehen muß? -.-

mf_2
2006-06-19, 20:00:17
Sephiroth[/POST]']
Hast du mal eine Beispiel Datei (beides, ZIP und normal)? Würde mir das Resultat einfach mal gerne angucken ;D

edit #2:
kann es sein das vor dem x bei den hex-werten auch ein \ stehen muß? -.-

Erstmal danke für die Antwort.
Was genau meinst du mit einer Beispieldatei? So ne Datei, die ich ausgegeben bekomme?
Wenn ja, habe ich sie hier hochgeladen:
http://mf2server.gotdns.org/test.zip
Sie sollte eine Datei 'lol.txt' enthalten, welche den Inhalt 'LOLROFL' hat. Sry, mir is auf die Schnelle nix besseres eingefallen x-D

Und was genau meinst du mit den Backslashes vor den x-Teilen? Soll das vor jedes 'x'? Ich kenne mich da ned so aus, aber ich *dachte* ( Vorsicht Halbwissen '), Hexwerte akzeptiert PHP auch so? Und wie gesagt, ich habe den Code ja ned geschrieben, er *sollte* ja funzen.
Naja, ich versuch das mal mit den x, indem ich vor JEDES x ein \ setze.

mf_2
2006-06-19, 20:04:25
JAAAAA, ES GEHT!!! Die 'x'e waren das Problem!

Thx Sephiroth!! :massa::massa::massa::massa::massa:

Sephiroth
2006-06-19, 20:09:26
mf_2[/POST]']Erstmal danke für die Antwort.
Was genau meinst du mit einer Beispieldatei? So ne Datei, die ich ausgegeben bekomme?
Wenn ja, habe ich sie hier hochgeladen:
http://mf2server.gotdns.org/test.zip
Sie sollte eine Datei 'lol.txt' enthalten, welche den Inhalt 'LOLROFL' hat. Sry, mir is auf die Schnelle nix besseres eingefallen x-D
danke

mf_2[/POST]']
Und was genau meinst du mit den Backslashes vor den x-Teilen? Soll das vor jedes 'x'? Ich kenne mich da ned so aus, aber ich *dachte* ( Vorsicht Halbwissen '), Hexwerte akzeptiert PHP auch so? Und wie gesagt, ich habe den Code ja ned geschrieben, er *sollte* ja funzen.
Naja, ich versuch das mal mit den x, indem ich vor JEDES x ein \ setze.
ok, hab mich nicht geirrt.
das "x50" ist bei php kein hex-wert sondern ein normaler string, erst durch "\x50" wird es als hex-wert interpretiert. (siehe) doku (http://de3.php.net/manual/de/language.types.string.php#language.types.string.syntax.double)

wenn die korrekturen vorgenommen wurden, dann sollte es klappen.

habe auch noch ein anderes beispiel gefunden, was fast genauso aufgebaut ist und wo das mit den esacpe-zeichen korrekt gemacht ist.
http://www.phpclasses.org/trackback/browse/package/2322.html

wenn du das zip-file mal öffnest, dann siehst du auch das da der ganze kram als string drinne steht
x50x4bx03x04x0ax00x00x00x00x00x00x00x00x00

Das "ZIP"-File hat einzig die Endung mit einem echtem ZIP-Archiv gemein. ;)

p.s.
freut mich das es nun klappt :)
das Problem lag wohl einfach an der Ausgabe auf der Webseite, denn im normalen PHP-File stand es bestimmt richtig