Création et extraction de fichiers à partir d'archives zip
Question
Existe-t-il une bibliothèque pour créer / extraire des fichiers zip en php?
La classe ZipArchive fonctionne de manière erratique, et ceci est mentionné sur php.net: (pour chaque fonction que j'ai vérifiée)
ZipArchive :: addEmptyDir (Aucune information de version disponible, peut-être uniquement dans CVS)
La solution 4
Bien, j'ai vérifié http://pear.php.net/package/Archive_Zip . Publié par Irmantas,
mais il dit ceci:
"Ce paquet n'est plus mis à jour et a été remplacé. Le package a été déplacé vers le canal pecl.php.net, le package zip. & Quot;
Puis j'ai cherché pear.php.net et suis tombé sur:
http://pear.php.net/package/File_Archive
File_Archive ne dispose cependant pas d'un ensemble de méthodes très intuitif. Mais je voulais une fonctionnalité simple de faire un fichier tar, et extraire des fichiers d’un fichier tar.
Les extraits suivants permettent d'atteindre cet objectif: Extraire des fichiers d’un fichier tar - >
<?php
require_once "File/Archive.php";
$tmp = 'output';
$t1 = 'check.tar';
File_Archive::setOption('tmpDirectory','tmp');
$r = File_Archive::extract(
File_Archive::read($t1.'/'),
File_Archive::toFiles($tmp)
);
?>
Ajout de fichiers à un fichier tar - >
<?php
require_once "Archive.php";
$dir = "../../mysql/data/blackStone/";
$files[0] = "";
$i = 0;
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false ) {
if( $file != "." && $file != ".." )
$files[$i++] = $dir.$file;
}
}
File_Archive::extract(
$files,
File_Archive::toArchive(
'check.tar',
File_Archive::toOutput()
)
);
?>
Autres conseils
Cochez PEAR Archive_Zip, il pourrait vous aider à http: // pear.php.net/package/Archive_Zip/docs/latest/Archive_Zip/Archive_Zip.html
PHP a un support Zip natif via GZip (peut ne pas être activé par défaut):
http://php.net/zlib
Vous pouvez également utiliser cette classe (Drupal ne fait pas partie de cette implémentation):
http://drupal.org/node/83253
Le même module, qui inclut ZipArchive , comprend également un certain nombre de fonctions qui permettent un accès procédural aux fichiers zip. Cette fonctionnalité est disponible en PHP 4 (depuis la version 4.0.7) et en PHP 5 (depuis la version 5.2.0).
$zip = zip_open("foo.zip");
$files = [];
while ($entry = zip_read($zip)) {
zip_entry_open($zip, $entry);
$files[zip_entry_name($entry)] = zip_entry_read($entry, zip_entry_filesize($entry));
zip_entry_close($entry);
}
zip_close($zip);
Vous pouvez appeler depuis PHP dans des assemblys .NET. Si cela ne vous dérange pas, vous pouvez utiliser DotNetZip - il est fiable et totalement non erratique.
Exemple de code:
<?php
try
{
$fname = "zip-generated-from-php-" . date('Y-m-d-His') . ".zip";
$zipOutput = "c:\\temp\\" . $fname;
# Use COM interop to get to Ionic Zip. (Windows only)
$zip = new COM("Ionic.Zip.ZipFile");
$zip->Name = $zipOutput;
$dirToZip= "c:\\temp\\psh";
# Encryption: 3=AES256, 2=AES128, 1=PKZIP, 0=None.
$zip->Encryption = 3;
$zip->Password = "AES-Encryption-Is-Secure";
$zip->AddDirectory($dirToZip);
$zip->Save();
$zip->Dispose();
if (file_exists($zipOutput))
{
header('Cache-Control: no-cache, must-revalidate');
header('Content-Type: application/x-zip');
header('Content-Disposition: attachment; filename=' . $fname);
header('Content-Length: ' . filesize($zipOutput));
readfile($zipOutput);
unlink($zipOutput);
}
else
{
echo '<html>';
echo ' <head>';
echo ' <title>Calling DotNetZip from PHP through COM</title>';
echo ' <link rel="stylesheet" href="basic.css"/>';
echo ' </head>';
echo '<body>';
echo '<h2>Whoops!</h2>' . "<br/>\n";
echo '<p>The file was not successfully generated.</p>';
echo '</body>';
echo '</html>';
}
}
catch (Exception $e)
{
echo '<html>';
echo ' <head>';
echo ' <title>Calling DotNetZip from PHP through COM</title>';
echo ' <link rel="stylesheet" href="basic.css"/>';
echo ' </head>';
echo '<body>';
echo '<h2>Whoops!</h2>' . "<br/>\n";
echo '<p>The file was not successfully generated.</p>';
echo '<p>Caught exception: ', $e->getMessage(), '</p>', "\n";
echo '<pre>';
echo $e->getTraceAsString(), "\n";
echo '</pre>';
echo '</body>';
echo '</html>';
}
?>