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?
Antworten
Zu viele Anzeigen?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' );
?>
Sehen Sie sich die eingebauten Zip-Funktionen an: http://php.net/manual/en/book.zip.php
En zip://
Protokoll wird von der ZIP-Erweiterung von PHP. Prüfen Sie in Ihrem phpinfo()
ausgeben, ob die Erweiterung installiert wurde oder nicht.
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;
?>