Rachus: Zip-Datei wird nicht erstellt

Hallo!

Mein Anliegen ist, dass ich gerne ein Verzeichnis einlesen möchte, die Struktur und den Inhalt in einer ZIP-Datei speichere und diese an den Client sende. Leider schaffe ich es nicht, eine einfache ZIP-Datei auch nur mithilfe von PHP zu erstellen.

Hier einmal der dazugehörige Codeausschnitt:

if (isset($_GET[$d_dir]) && is_dir($root.$_GET[$d_dir]))  
{  
	$zip=new ZipArchive();  
	$zip->open('testfile.zip', ZipArchive::CREATE);  
	zipRecursion($zip, $root.$_GET[$d_dir], '');  
	//header('Content-Type: application/zip');  
	//header('Content-Disposition: attachment; filename="'.(substr($_GET[$d_dir], strrpos($_GET[$d_dir], '/'))).'.zip"');  
	$zip->close();  
	exit();  
}

In der Funktion zipRecursion wird der Inhalt der Verzeichnisstruktur eingelesen:

function zipRecursion($zip, $dir, $docroot)  
{  
	$d_dir=$GLOBALS['d_dir'];  
	$root=$GLOBALS['root'];  
	  
	$files=getEntries($root.$_GET[$d_dir]);  
	$len=count($files);  
	for ($i=0; $i<$len; ++$i)  
	{  
		if ($files[$i]=='.' || $files[$i]=='..') continue;  
		if (is_file($root.$files[$i])) $zip->addFile($root.$files[$i], $docroot.$files[$i]);  
		else if (is_dir($root.$files[$i]))  
		{  
			$zip->addEmptyDir($files[$i]);  
			zipRecursion($zip, $root.$files[$i].'/', $docroot.$files[$i].'/');  
		}  
	}  
}

Selbst wenn diese Funktion nicht funktionieren sollte, müsste doch eigentlich wenigstens eine ZIP-Datei (testfile.zip) im gleichen Verzeichnis erzeugt werden, oder? Jedoch finde ich keine neue Datei!

Der benutzte Server Apache 2 und PHP hat die Version 5.3.3-7. Es wird keine Fehlermeldung angezeigt.

Hoffe, ihr könnt mir helfen!

Rachus

  1. Ich hoff auch, dass ihr ihn helfen könnt XD

  2. Hi!

    Selbst wenn diese Funktion nicht funktionieren sollte, müsste doch eigentlich wenigstens eine ZIP-Datei (testfile.zip) im gleichen Verzeichnis erzeugt werden, oder? Jedoch finde ich keine neue Datei!

    Das kann man so ohne weiteres nicht sagen, wenn man dein System nicht begutachten und eventuelle Verdachte verfizieren oder falsifizieren kann.

    Der benutzte Server Apache 2 und PHP hat die Version 5.3.3-7.

    Wenn du versionsabhängige Probleme vermutest, könntest du die auch erst einmal zu recherchieren versuchen.

    Es wird keine Fehlermeldung angezeigt.

    Nicht immer werden Meldungen angezeigt. Wichtiger als sich auf Meldungen zu verlassen wäre, die Rückgabewerte der verwendeten Funktionen auf Fehlerhinweise zu untersuchen. Es ist auch nicht sinnvoll, bei aufgetretenen Fehlern geradeaus im Programm fortzufahren, als ob nichts passiert wäre.

    Lo!

    1. Hallo dedlfix!

      Irgendwie habe ich mir gedacht, dass du wieder derjenige sein wirst, der meine Frage(n) zu beantworten weiß!

      Das kann man so ohne weiteres nicht sagen, wenn man dein System nicht begutachten und eventuelle Verdachte verfizieren oder falsifizieren kann.

      Folgende Probleme konnte ich bereits ausschließen:

      • falsches Verzeichnis (mehrfach mit absoluten und relative Pfaden versucht)
      • fehlende Rechte (der gleiche Benutzer kann über FTP beliebig auf Dateien im Verzeichnis zugreifen)

      Wenn du versionsabhängige Probleme vermutest, könntest du die auch erst einmal zu recherchieren versuchen.

      Habe ich getan, nur waren nirgends Einschränkungen angegeben. Aber eine Angabe zu viel kann ja nicht schaden.

      Nicht immer werden Meldungen angezeigt. Wichtiger als sich auf Meldungen zu verlassen wäre, die Rückgabewerte der verwendeten Funktionen auf Fehlerhinweise zu untersuchen. Es ist auch nicht sinnvoll, bei aufgetretenen Fehlern geradeaus im Programm fortzufahren, als ob nichts passiert wäre.

      Stimmt, das ist etwas, was ich noch nicht in Betracht gezogen habe. Nur ist das Problem, dass der Rückgabewert tatsächlich "1" bzw. "TRUE" ist. Selbst das Beispielskript zum Erstellen einer ZIP-Datei erwirkt den gleichen Effekt.

      Somit weiß ich einfach nicht mehr weiter und hoffe, Euch fällt doch noch etwas auf.

      Schöne Grüße

      Rachus

      1. Hi!

        Nicht immer werden Meldungen angezeigt. Wichtiger als sich auf Meldungen zu verlassen wäre, die Rückgabewerte der verwendeten Funktionen auf Fehlerhinweise zu untersuchen. Es ist auch nicht sinnvoll, bei aufgetretenen Fehlern geradeaus im Programm fortzufahren, als ob nichts passiert wäre.

        Stimmt, das ist etwas, was ich noch nicht in Betracht gezogen habe. Nur ist das Problem, dass der Rückgabewert tatsächlich "1" bzw. "TRUE" ist. Selbst das Beispielskript zum Erstellen einer ZIP-Datei erwirkt den gleichen Effekt.

        Das Beispielscript schafft es, eine Datei anzulegen?

        Somit weiß ich einfach nicht mehr weiter und hoffe, Euch fällt doch noch etwas auf.

        Ohne das genauer zu untersuchen, vielleicht ein Fehler in der Rekursion? Kommt dein Script an allen strategisch wichtigen Punkten vorbei, also wird das close() aufgerufen? (Kontrollausgabe irgendeines Textes vorher und/oder nachher)

        Lo!

        1. Hallo,

          Das Beispielscript schafft es, eine Datei anzulegen?

          nein, jedesmal, wenn ich es ausführe, steht zwar "ok" dort, aber eine Datei finde ich nicht.

          Ohne das genauer zu untersuchen, vielleicht ein Fehler in der Rekursion? Kommt dein Script an allen strategisch wichtigen Punkten vorbei, also wird das close() aufgerufen? (Kontrollausgabe irgendeines Textes vorher und/oder nachher)

          Ja, das Skript kommt bis zum close() und auch noch weiter. Die Kontrollausgaben habe ich bereits ausprobiert. Deswegen verwundert es mich so sehr, dass überhaupt keine Datei auch nur erstellt wird.

          Grüße

          Rachus

          1. Hi!

            Ja, das Skript kommt bis zum close() und auch noch weiter. Die Kontrollausgaben habe ich bereits ausprobiert. Deswegen verwundert es mich so sehr, dass überhaupt keine Datei auch nur erstellt wird.

            Vielleicht legst du die Datei an einem anderen Ort ab, als du vermutest. Entzieh doch mal dem geplanten Verzeichnis die Schreibrechte, dann sollte es ja einen Fehler geben. Wenn nicht, benenn die Datei einzigartig (wenn noch nicht geschehen) und lass sie im gesamten System suchen.

            Lo!

            1. Hallo,

              Vielleicht legst du die Datei an einem anderen Ort ab, als du vermutest. Entzieh doch mal dem geplanten Verzeichnis die Schreibrechte, dann sollte es ja einen Fehler geben. Wenn nicht, benenn die Datei einzigartig (wenn noch nicht geschehen) und lass sie im gesamten System suchen.

              entweder ich bin nicht fähig, mit "find" umzugehen, oder die Datei ist im Dateisystem nirgendwo zu finden.

              Grüße

              Rachus

              1. Hi!

                Vielleicht legst du die Datei an einem anderen Ort ab, als du vermutest. Entzieh doch mal dem geplanten Verzeichnis die Schreibrechte, dann sollte es ja einen Fehler geben. Wenn nicht, benenn die Datei einzigartig (wenn noch nicht geschehen) und lass sie im gesamten System suchen.

                entweder ich bin nicht fähig, mit "find" umzugehen, oder die Datei ist im Dateisystem nirgendwo zu finden.

                Wenn es am "entweder" nicht liegt, dann wäre die Sache sehr mysteriös und das gibt es in der Computerei systembedingt nicht. Mit genügend Aufwand lässt sich alles erklären.

                find / -name "foo.zip" -print

                wäre eine Anwendung, die das gesamte System nach foo.zip durchsucht.

                Lo!

                1. Hallo,

                  find / -name "foo.zip" -print

                  wäre eine Anwendung, die das gesamte System nach foo.zip durchsucht.

                  danke, das war noch etwas was mir an meinen Linuxkenntnissen gefehlt hat: Das Wissen über die korrekte Anwendung von "find".
                  Jedoch kann ich jetzt nur bestätigen, dass die Datei im Dateisystem nirgends zu finden ist.

                  Jedoch habe ich eine neue Erkenntnis gewonnen: Wenn ich nicht "addFile()" nutze, sondern "addFromString()" wird eine Datei erstellt. Nur verwunderlich, dass der die Datei, die ich extra zum einfügen erstellt habe, nicht angenommen wird. Bei meinem Test hat es bei keiner Datei funktioniert und ein Fehler wurde immer nur bei "close()" geliefert.
                  Langsam glaube ich, dass "ZipArchive" nicht einwandfrei funktioniert. Vielleicht sollte ich mich nach Alternativen umschauen...

                  Aber schon einmal danke für deine Hilfe!

                  Grüße

                  Rachus