Взгляните на мой сценарий Quick Unzipper. Я написал это для личного использования некоторое время назад при загрузке больших zip-файлов на сервер. Это была резервная копия, и тысячи файлов навсегда работали с FTP, поэтому использование zip-файла было быстрее. Я использую Git и все такое, но для меня не было другого выбора. Я помещаю этот php-файл в каталог, в который я хочу, чтобы файлы уходили, и поместил zip-файл в тот же каталог. Для моего сценария все они должны работать в одном каталоге. Это был простой способ обеспечить его для моих нужд, поскольку все, что мне нужно, было в том же каталоге.
Быстрый Unzipper: https://github.com/incomepitbull/QuickUnzipper/blob/master/unzip.php
Я связала файл, потому что я не демонстрации репо, только код, который делает распаковать клеща. В современных версиях PHP не должно быть ничего, что не включено в вашу настройку. Поэтому вам не нужно делать какие-либо изменения конфигурации сервера, чтобы использовать это.
Вот PHP Doc для ZipArchive класса он использует: http://php.net/manual/en/class.ziparchive.php
Существует не прилежащий способ сделать то, что вы хотите, который является позором. Поэтому я бы разархивировал файл в каталог temp, а затем использовал другую функцию, чтобы скопировать содержимое туда, где вы хотите. Поэтому при использовании ZipArchive вам нужно будет вернуть первый элемент, чтобы получить имя папки, если оно неизвестно. Если папка известна, то есть: то же самое надоедливое имя папки каждый раз, тогда вы можете жестко закодировать имя.
Я вернул первый элемент из индекса. Поэтому, если вы ВСЕГДА имеете почтовый индекс с 1 папкой внутри него и все в этой папке, это сработает. Однако, если у вас есть zip-файл без всякой консолидированной внутри 1 папки, он потерпит неудачу. Код, который я добавил, позаботится о вашем вопросе. Вам нужно будет добавить дополнительную логику для обработки альтернативных случаев.
Кроме того, вы останетесь со старым каталогом, когда мы извлечем его в каталог temp для «обработки». Поэтому я включил код, чтобы удалить его.
ПРИМЕЧАНИЕ. В коде используется много примеров if, чтобы показать шаги обработки, и распечатать сообщение для целей тестирования. Вам нужно будет изменить его в соответствии с вашими потребностями.
<?php
public function copyDirectoryContents($source, $destination, $create=false)
{
if (! is_dir($source)) {
return false;
}
if (! is_dir($destination) && $create === true) {
@mkdir($destination);
}
if (is_dir($destination)) {
$files = array_diff(scandir($source), array('.','..'));
foreach ($files as $file)
{
if (is_dir($file)) {
copyDirectoryContents("$source/$file", "$destination/$file");
} else {
@copy("$source/$file", "$destination/$file");
}
}
return true;
}
return false;
}
public function removeDirectory($directory, $options=array())
{
if(!isset($options['traverseSymlinks']))
$options['traverseSymlinks']=false;
$files = array_diff(scandir($directory), array('.','..'));
foreach ($files as $file)
{
if (is_dir("$directory/$file"))
{
if(!$options['traverseSymlinks'] && is_link(rtrim($file,DIRECTORY_SEPARATOR))) {
unlink("$directory/$file");
} else {
removeDirectory("$directory/$file",$options);
}
} else {
unlink("$directory/$file");
}
}
return rmdir($directory);
}
$file = dirname(__FILE__) . '/file.zip'; // full path to zip file needing extracted
$temp = dirname(__FILE__) . '/zip-temp'; // full path to temp dir to process extractions
$path = dirname(__FILE__) . '/extracted'; // full path to final destination to put the files (not the folder)
$firstDir = null; // holds the name of the first directory
$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) {
$firstDir = $zip->getNameIndex(0);
$zip->extractTo($temp);
$zip->close();
$status = "<strong>Success:</strong> '$file' extracted to '$temp'.";
} else {
$status = "<strong>Error:</strong> Could not extract '$file'.";
}
echo $status . '<br />';
if (empty($firstDir)) {
echo 'Error: first directory was empty!';
} else {
$firstDir = realpath($temp . '/' . $firstDir);
echo "First Directory: $firstDir <br />";
if (is_dir($firstDir)) {
if (copyDirectoryContents($firstDir, $path)) {
echo 'Directory contents copied!<br />';
if (removeDirectory($directory)) {
echo 'Temp directory deleted!<br />';
echo 'Done!<br />';
} else {
echo 'Error deleting temp directory!<br />';
}
} else {
echo 'Error copying directory contents!<br />';
}
} else {
echo 'Error: Could not find first directory';
}
}
В чем ситуация? Всегда ли файлы всегда входят в папку верхнего уровня или файлы различаются в зависимости от того, как они входят? Откуда вы знаете, что верхний уровень всегда будет пустым? –
Точно: файлы всегда поставляются с папкой верхнего уровня, которая мне не нужна при извлечении их на сервере. – Harmageddon