ZIP-Datei erstellen misslingt

Thomas D

Erfahrenes Mitglied
Hallo!

Ich möchte eine ZIP-Datei mittels PHP (XAMP 1.7) erstellen. Der unten weiter vermerkte Code liefert auch TRUE zurück, doch die Datei ist unter dem OutputPath nicht zu finden. Irgendwie kann ich mir das nicht erklären :confused: ...

Code:
define ("outputPath", "outDir/");

if (publizieren ("ClientBin/wbt/original/content"))
	echo "Publizieren erfolgreich.";
else
	echo "Publizieren fehlgeschlagen.";

function publizieren ($contentPath)
{
	$zip = new ZipArchive ();
	$filename = uniqueFileName ();

	echo $filename;

	if ($zip->open ($filename, ZIPARCHIVE::CREATE) != TRUE)
		return false;

	if (!$zip->addFile ($contentPath))
	{
		$zip->close ();
		return false;
	}

	return true;
}

function uniqueFileName ()
{
	do
	{
		$filename = outputPath .rand () .".zip";
	}
	while (file_exists ($filename));

	return $filename;
}
 
Hi!

Hast Du es mal mit absoluten Pfadangaben probiert - bzw. geschaut, ob die Dateien vielleicht woanders gelandet sind?

Gruß
Enum
 
Hallo!

Habe ich beides gemacht, aber die Datei wird nicht erstellt (obwohl er TRUE zurückgibt). Folgende Änderung habe ich durchgeführt, doch unter D:\ ist nichts zu finden:

Code:
define ("outputPath", "D:\\");
 
Hi,

ich glaube nicht, dass Du auf diese Weise ein ganzes Verzeichnis (samt Inhalt) hinzufügen kannst. Durchlaufe das Verzeichnis in einer Schleife und füge jeden Eintrag mit addFile() dem Archiv hinzu.

LG
 
Moin!

Sorry, ich hab's jetzt erst gesehen: Deine Funktion gibt true zurück, dabei ist ja noch gar nichts passiert: Du rufst $zip->close(); nur im Fehlerfall auf. Das Anlegen des Archivs wie das Hinzufügen der Dateien werden allerdings erst durchgeführt, nachdem $zip->close(); aufgerufen wurde...

Greetz
Enum
 
Danke für eure konstruktiven Hinweise :)! Ich werde diese am Mo. gleich ausprobieren (verfüge gerade nicht über den Quellcode).
 
ich glaube nicht, dass Du auf diese Weise ein ganzes Verzeichnis (samt Inhalt) hinzufügen kannst. Durchlaufe das Verzeichnis in einer Schleife und füge jeden Eintrag mit addFile() dem Archiv hinzu.

Das war's im Endeffekt. Wer denkt denn schon, dass das ganze so hirnverblödet ist, dass keine Fehlermeldung zurückgegeben wird, wenn ein Directory hinzugeadded wird? ...

Leider funktioniert das ganze jedoch noch immer nicht ganz. Das Script zippt bis zu einem gewissen Zeitpunkt und gibt danach wieder true zurück. Doch wenn ich die Datei mit Win-RAR öffne, dann kommt erstens mal eine Fehlermeldung, dass ein unerwartetes Dateiende gefunden worden wäre. Zudem sind auch bei weitem nicht alle Dateien gezippt (das Script ist dazwischen wohl abgebrochen worden).

Gut, dachte ich mir, setze ich halt mal das Timeout etwas weiter nach oben, doch auch das hat nichts geholfen. Kann doch nicht sein, dass so etwas Banales wie das Erstellen eines ZIP-Archives derart große Probleme mit sich bringt :confused: ...

Code:
ini_set(max_execution_time, 100);

define ("outputPath", "outDir/");

if (publizieren ("ClientBin/wbt/original/content"))
	echo "Publizieren erfolgreich.";
else
	echo "Publizieren fehlgeschlagen.";

function publizieren ($contentPath)
{
	$zip = new ZipArchive ();
	$filename = uniqueFileName ();

	echo $filename;

	if ($zip->open ($filename, ZIPARCHIVE::CREATE) != TRUE)
		return false;

	$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator ($contentPath));

	foreach ($iterator as $key=>$value)
	{
		$zip->addFile (realpath($key), $key);
	}


	$zip->close ();
	return true;
}

function uniqueFileName ()
{
	do
	{
		$filename = outputPath .rand () .".zip";
	}
	while (file_exists ($filename));

	return $filename;
}

EDIT: Dürfte wohl daran liegen: http://bugs.php.net/bug.php?id=40494 Echt arg, dass das nicht g'scheid in PHP implementiert ist :(. Zumahl ich schon extra auf PHP ausgewichen bin, da auch .NET keine passende ZIP-Integration hat. Werde ich wohl Java nehmen müssen ...
 
Zuletzt bearbeitet:
Zurück