8 Stimmen

Der beste Weg, eine Zip-Datei in PHP zu lesen

file_get_contents("zip:///a/b/c.zip") kehrt zurück NULL . Wie kann ich den ungezippten Inhalt einer Zip-Datei in PHP 5+ lesen?

9voto

AminFarajzadeh Punkte 362

Verwenden. ZipArchive Klasse

$zip = new ZipArchive;
$zip->open('test.zip');
echo $zip->getFromName('filename.txt');
$zip->close();

4voto

Svisstack Punkte 15446

Utilice zip_open y zip_read Funktionen zu tun. Die Dokumentation dazu finden Sie unter http://php.net/manual/en/function.zip-read.php

<?php
/**
* This method unzips a directory within a zip-archive
*
* @author Florian 'x!sign.dll' Wolf
* @license LGPL v2 or later
* @link http://www.xsigndll.de
* @link http://www.clansuite.com
*/

function extractZip( $zipFile = '', $dirFromZip = '' )
{   
    define(DIRECTORY_SEPARATOR, '/');

    $zipDir = getcwd() . DIRECTORY_SEPARATOR;
    $zip = zip_open($zipDir.$zipFile);

    if ($zip)
    {
        while ($zip_entry = zip_read($zip))
        {
            $completePath = $zipDir . dirname(zip_entry_name($zip_entry));
            $completeName = $zipDir . zip_entry_name($zip_entry);

            // Walk through path to create non existing directories
            // This won't apply to empty directories ! They are created further below
            if(!file_exists($completePath) && preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) ) )
            {
                $tmp = '';
                foreach(explode('/',$completePath) AS $k)
                {
                    $tmp .= $k.'/';
                    if(!file_exists($tmp) )
                    {
                        @mkdir($tmp, 0777);
                    }
                }
            }

            if (zip_entry_open($zip, $zip_entry, "r"))
            {
                if( preg_match( '#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)) ) )
                {
                    if ($fd = @fopen($completeName, 'w+'))
                    {
                        fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)));
                        fclose($fd);
                    }
                    else
                    {
                        // We think this was an empty directory
                        mkdir($completeName, 0777);
                    }
                    zip_entry_close($zip_entry);
                }
            }
        }
        zip_close($zip);
    }
    return true;
}

// The call to exctract a path within the zip file
extractZip( 'clansuite.zip', 'core/filters' );
?>

2voto

VeeWee Punkte 540

Sehen Sie sich die eingebauten Zip-Funktionen an: http://php.net/manual/en/book.zip.php

1voto

joschi Punkte 12108

En zip:// Protokoll wird von der ZIP-Erweiterung von PHP. Prüfen Sie in Ihrem phpinfo() ausgeben, ob die Erweiterung installiert wurde oder nicht.

0voto

S. Francis Punkte 119

Ich antworte auf den ersten Teil der Frage, d. h. auf die Verwendung der Methode file_get_contents file_get_contents("zip:///a/b/c.zip")' Normalerweise wird diese Methode verwendet, um eine bestimmte Datei zu lesen, die sich in der Zip-Datei befindet. Um den gesamten Inhalt zu extrahieren, haben andere gute Antworten gegeben.

Ich verwende PHP 7.2.34 unter Windows und später unter Linux. Ich habe eine Zip-Datei bei d: \data und diese Syntax funktioniert unter Windows. Sie tut echo den Inhalt von example1.py, der sich in einem "Ordner" in der ZIP-Datei befindet.

Möglicherweise hat es auch damit zu tun, wo/wie die Zip-Datei erstellt wurde. Als ich die Zip-Datei in PHP erstellt hatte, waren die internen Trennzeichen Backslashes, aber als Windows die Zip-Datei erstellte (mit der Funktion "An komprimierten Ordner senden" im Windows-Explorer), verwendete Windows die Linux-Konvention innerhalb der Zip-Datei!

Hier sind weitere Tests erforderlich, um festzustellen, welches Trennzeichen für die internen Pfade in der ZIP-Datei verwendet wird

    <?php
    $str = file_get_contents('zip://d:/data/demo.zip#examples\\example1.py');
    echo $str;
    ?>

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