2 Stimmen

Zip-Dateien in PHP aus einem anderen Verzeichnis ohne Pfadstruktur

Ich versuche, zwei Dateien in einem anderen Verzeichnis zu komprimieren, ohne die Ordnerhierarchie mit zu komprimieren.

Das Ereignis wird durch einen Tastendruck ausgelöst, der Javascript veranlasst, Informationen mittels AJAX an PHP zu senden. PHP ruft ein Perl-Skript auf (um die Vorteile des XLSX-Writer-Moduls von Perl und die Tatsache zu nutzen, dass PHP irgendwie scheiße ist, aber ich schweife ab...), das die Dateien ein paar Ordner weiter unten in der Hierarchie ablegt. Der entsprechende Code ist unten dargestellt.

system("createFiles.pl -ids ${rows} -test ${test} -path ${path}",$retVal);

`zip ${path}/{$test}_both.zip ${path}/${test}.csv ${path}/${test}.xlsx`;
`zip ${path}/{$test}_csv.zip  ${path}/${test}.csv`;

Das Problem ist, dass die Zip-Datei Folgendes enthält ${path} Hierarchie, die durchlaufen werden muss, bevor die Dateien angezeigt werden (siehe unten):

Zip with hierarchy

Ich habe dies versucht (cd vor jedem Zip-Befehl):

system("createFiles.pl -ids ${rows} -test ${test} -path ${path}",$retVal);

`cd ${path}; zip {$test}_both.zip ${test}.csv ${test}.xlsx`;
`cd ${path}; zip {$test}_csv.zip  ${test}.csv`;

Und es hat funktioniert, aber es scheint ein Hack zu sein. Gibt es einen besseren Weg?

1voto

Oldskool Punkte 33485

Wenn Sie PHP 5 >= 5.2.0 verwenden, können Sie die ZipArchiv Klasse. Sie können dann den vollständigen Pfad als Quelldateinamen und nur den Dateinamen als Zielnamen verwenden. Zum Beispiel so:

$zip = new ZipArchive;
if($zip->open("{$test}_both.zip", ZIPARCHIVE::OVERWRITE) === true) {
    // Add the files here with full path as source, short name as target
    $zip->addFile("${path}/${test}.csv", "${test}.csv");
    $zip->addFile("${path}/${test}.xlsx", "${test}.xlsx");
    $zip->close();
} else {
    die("Zip creation failed.");
}

// Same for the second archive
$zip2 = new ZipArchive;
if($zip2->open("{$test}_csv.zip", ZIPARCHIVE::OVERWRITE) === true) {
    // Add the file here with full path as source, short name as target
    $zip2->addFile("${path}/${test}.csv", "${test}.csv");
    $zip2->close();
} else {
    die("Zip creation failed.");
}

1voto

webaware Punkte 2717

Die ZipArchive-Antwort von Oldskool ist gut. Ich habe ZipArchive verwendet und es funktioniert. Ich empfehle jedoch PclZip stattdessen, da es vielseitiger ist (z.B. ermöglicht es das Komprimieren ohne Komprimierung, was ideal ist, wenn Sie Bilder komprimieren, die bereits komprimiert sind, und viel schneller ist). PclZip unterstützt die PCLZIP_OPT_REMOVE_ALL_PATH Option, um alle Dateipfade zu entfernen. z.B.

$zip = new PclZip("$path/{$test}_both.zip");
$files = array("$path/$test.csv", "$path/$test.xlsx");

// create the Zip archive, without paths or compression (images are already compressed)
$properties = $zip->create($files, PCLZIP_OPT_REMOVE_ALL_PATH);
if (!is_array($properties)) {
    die($zip->errorInfo(true));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X