Php zip извлечь все файлы

ZipArchive::extractTo

Извлечение всего архива или его части в указанное место назначения.

Разрешения по умолчанию для извлечённых файлов и каталогов предоставляют максимально широкий доступ. Это можно ограничить установкой текущего umask, который изменяется с помощью umask() .

Список параметров

Место назначение, куда извлекать файлы.

Элементы для извлечения. Может принимать как одно значение, так и массив записей.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Извлечь все содержимое

$zip = new ZipArchive ;
if ( $zip -> open ( ‘test.zip’ ) === TRUE ) $zip -> extractTo ( ‘/my/destination/dir/’ );
$zip -> close ();
echo ‘готово’ ;
> else echo ‘ошибка’ ;
>
?>

Пример #2 Извлечь два элемента

$zip = new ZipArchive ;
$res = $zip -> open ( ‘test_im.zip’ );
if ( $res === TRUE ) $zip -> extractTo ( ‘/my/destination/dir/’ , array( ‘pear_item.gif’ , ‘testfromfile.php’ ));
$zip -> close ();
echo ‘готово’ ;
> else echo ‘ошибка’ ;
>
?>

Примечания

Замечание:

Файловые системы Windows NTFS не поддерживают некоторые символы в именах файлов, а именно <|>*?»: . Имена файлов с точкой в конце также не поддерживаются. В отличие от некоторых инструментов извлечения, этот метод не поддерживает замену этих символов на подчёркивание, а вместо этого возникает ошибка при извлечении таких файлов.

User Contributed Notes 16 notes

If you want to copy one file at a time and remove the folder name that is stored in the ZIP file, so you don’t have to create directories from the ZIP itself, then use this snippet (basically collapses the ZIP file into one Folder).

$zip = new ZipArchive ;
if ( $zip -> open ( $path ) === true ) for( $i = 0 ; $i < $zip ->numFiles ; $i ++) $filename = $zip -> getNameIndex ( $i );
$fileinfo = pathinfo ( $filename );
copy ( «zip://» . $path . «#» . $filename , «/your/new/destination/» . $fileinfo [ ‘basename’ ]);
>
$zip -> close ();
>

?>

* On a side note, you can also use $_FILES[‘userfile’][‘tmp_name’] as the $path for an uploaded ZIP so you never have to move it or extract a uploaded zip file.

If you want to extract the files just to the current folder, simply use
$zip->extractTo(«.»);

It took me hours to figure this out.

The extractTo() method does not offer any parameter to allow extracting files and folders recursively from another (parent) folder inside the ZIP archive. With the following method it is possible:

class my_ZipArchive extends ZipArchive
public function extractSubdirTo ( $destination , $subdir )
$errors = array();

// Prepare dirs
$destination = str_replace (array( «/» , «\\» ), DIRECTORY_SEPARATOR , $destination );
$subdir = str_replace (array( «/» , «\\» ), «/» , $subdir );

if ( substr ( $destination , mb_strlen ( DIRECTORY_SEPARATOR , «UTF-8» ) * — 1 ) != DIRECTORY_SEPARATOR )
$destination .= DIRECTORY_SEPARATOR ;

if ( substr ( $subdir , — 1 ) != «/» )
$subdir .= «/» ;

// Extract files
for ( $i = 0 ; $i < $this ->numFiles ; $i ++)
$filename = $this -> getNameIndex ( $i );

if ( substr ( $filename , 0 , mb_strlen ( $subdir , «UTF-8» )) == $subdir )
$relativePath = substr ( $filename , mb_strlen ( $subdir , «UTF-8» ));
$relativePath = str_replace (array( «/» , «\\» ), DIRECTORY_SEPARATOR , $relativePath );

if ( mb_strlen ( $relativePath , «UTF-8» ) > 0 )
if ( substr ( $filename , — 1 ) == «/» ) // Directory
// New dir
if (! is_dir ( $destination . $relativePath ))
if (!@ mkdir ( $destination . $relativePath , 0755 , true ))
$errors [ $i ] = $filename ;
>
else
if ( dirname ( $relativePath ) != «.» )
if (! is_dir ( $destination . dirname ( $relativePath )))
// New dir (for file)
@ mkdir ( $destination . dirname ( $relativePath ), 0755 , true );
>
>

// New file
if (@ file_put_contents ( $destination . $relativePath , $this -> getFromIndex ( $i )) === false )
$errors [ $i ] = $filename ;
>
>
>
>

return $errors ;
>
>
?>

Example:
echo «» ;

$zip = new my_ZipArchive ();
if ( $zip -> open ( «test.zip» ) === TRUE )
$errors = $zip -> extractSubdirTo ( «C:/output» , «folder/subfolder/» );
$zip -> close ();

echo ‘ok, errors: ‘ . count ( $errors );
>
else
echo ‘failed’ ;
>
?>

Источник

Как использовать Zip и Unzip файлы в PHP

Monty Shokeen

Monty Shokeen Last updated Jun 13, 2022

Сжатие файлов при их передаче через Интернет имеет множество преимуществ. В большинстве случаев, общий размер всех файлов в сжатом виде приятно уменьшается. Это означает, что вы сэкономите трафик, а пользователи получат более быструю скорость загрузки. Когда пользователи загрузят файл, они могут распаковывать его в любое время. Короче говоря, сжатие может сделать передача файлов через Интернет намного проще и для вас, и для ваших посетителей.

Один из факторов, из-за которого вы можете отказаться от сжатия файлов или этот процесс для вас очень утомителен — вы делаете это вручную. К счастью, у PHP есть множество расширений, которые специально предназначены для сжатия и извлечения файлов. Вы можете использовать функции, доступные в этих расширениях, для автоматического сжатия файлов на PHP.

В этом уроке вы научитесь применять zip и unzip — сжимать и извлекать файлы в/из zip-архив в PHP. Вы также узнаете, как удалить или переименовать файлы в архиве, не без их извлечения.

Сжатие файлов в PHP

Класс PHP ZipArchive обладает множеством свойств и методов, которые помогут вам сжсжимать и распаковывать все ваши файлы.

Сжатие отдельных файлов

Вы можете добавлять файлы в zip-архив по одному или сразу весь каталог. В любом случае первым шагом является создание нового экземпляра ZipArchive , а затем вызов метода open ($filename, [$flags]) . Этот метод откроет новый zip-архив для чтения, записи или других изменений. Существует четыре допустимых значения для необязательного параметра $flag , которым определяется способ обработки.

  • ZipArchive::OVERWRITE — этот флаг перезапишет содержимое в указанном архиве, если он уже существует.
  • ZipArchive::CREATE — этот флаг создаст новый архив, если он ещё не существует.
  • ZipArchive::EXCL — этот флаг приведёт к ошибке, если архив уже существует.
  • ZipArchive::CHECKCONS — этот флаг сообщает PHP о выполнении дополнительных проверок на целостность архива и выдаст ошибку, если при неудачной проверке.

Вы можете посмотреть документацию по этому методу, чтобы узнать о различных кодах ошибок, возвращаемых в случае сбоев при открытии файла. Если zip-файл успешно открыт или создан, метод вернет true .

Если архив откроется успешно, вы можете использовать метод addFile($filename, $localname, $start, $length) для добавления любого файла с заданным путем в ваш архив. Параметр $filename — это путь к файлу, который вы хотите добавить в архив. Параметр $localname используется для присвоения имени файлу для хранения его внутри архива. Вы можете вызывать addFile() каждый раз, когда хотите добавить новый файл в архив.

После добавления всех необходимых файлов в архив, вы можете вызвать метод close() , чтобы закрыть его и сохранить изменения.

Допустим, у вас есть веб-сайт, который позволяет пользователям скачивать файлы шрифтов вместе с их лицензиями. Файлы, подобные этим, станут прекрасными примерами автоматизированного архивирования на PHP. Следующий код показывает, как это делается.

$zip->open('compressed/font_files.zip', ZipArchive::CREATE); 
$zip->addFile('fonts/Monoton/Monoton-Regular.ttf', 'Monoton-Regular.ttf'); 
$zip->addFile('fonts/Monoton/OFL.txt', 'license.txt'); 

Мы начнём с создания экземпляра ZipArchive , а затем с помощью метода open() создадим наш архив. С помощью метода addFile() добавим в архив файлы шрифта .ttf и лицензии .txt.

Следует отметить, что исходные файлы находились внутри каталога fonts/Monoton. Однако, код PHP помещает его прямо в корень нашего архива. Вы можете изменить структуру каталогов, а также имена файлов, находящихся в архиве.

Сжатие нескольких файлов из каталога

Добавление отдельных файлов в архив, со временем, может стать утомительным. Например, вы можете создать архив всех .pdf или .png файлов в каталоге. В этом случае, метод addGlob($pattern, $flags, $options) докажет свою полезность. Единственный минус этого метода в том, что вы теряете контроль над расположением отдельных файлов в архиве. Однако, вы все равно можете влиять на структуру каталогов внутри архива, используя параметр $options . Параметры передаются в виде ассоциативного массива.

  • add_path — значение, которое вы назначаете на add_path , ставится перед (префикс) локальным адресом файла в архиве.
  • remove_path — значение, которое вы назначаете на remove_path , используется для удаления соответствующего префикса из пути различных файлов, которые добавляются в архив.
  • remove_all_path — если задать remove_all_path значение true , то это приведет к удалению всего из пути файла, кроме его названия. В этом случае файлы добавятся в корень архива.

Важно помнить, что удаление пути происходит до добавления префикса указанного в значениий add_path .

Следующий фрагмент кода прояснит использование addGlob() и всех этих параметров.

$zip->open('compressed/user_archive.zip', ZipArchive::CREATE); 
$options = array('add_path' => 'light_wallpapers/', 'remove_all_path' => TRUE); 
$zip->addGlob('lights/*.jpg', 0, $options); 
$options = array('add_path' => 'font_files/', 'remove_all_path' => TRUE); 
$zip->addGlob('documents/*.ttf', 0, $options); 
$options = array('add_path' => 'pdf_books/', 'remove_all_path' => TRUE); 
$zip->addGlob('documents/*.pdf', 0, $options); 
$options = array('add_path' => 'images/', 'remove_all_path' => TRUE); 
$zip->addGlob('documents/*.', GLOB_BRACE, $options); 

Как обычно, мы начинаем с создания экземпляра ZipArchive и затем используем метод open() для создания нашего архива. Каждый раз перед вызовом метода addGlob() , мы указываем разные значения для ключа add_path в массиве $options . Таким образом, мы можем одновременно обработать один конкретный набор файлов и применить к нему соответствующие параметры архивирования.

В первом случае мы перебираем все файлы .jpg в каталоге lights и помещаем их в каталог light_wallpapers в архиве. Аналогично, мы перебираем все файлы .ttf в каталоге documents, а затем помещаем их в архив в папку с именем font_files. Наконец, мы перебираем сразу все файлы .jpg и .png в наших документах и помещаем их все вместе в каталог images.

Как вы можете видеть, значения в параметре $options полезны при организации содержимого внутри архива.

Извлечение содержимого из архива

У класса ZipArchive есть метод для извлечения содержимого архива, называемый extractTo($destination, $entries) . Вы можете использовать его для извлечения всего в архиве или только определенных файлов. Параметр $entries может использоваться для указания одного имени файла, который нужно извлечь, или же, вы можете использовать его для передачи массива файлов.

Важно помнить, что вам нужно указать правильный путь к файлу внутри архива, чтобы извлечь его. Например, мы заархивировали файл шрифта AlegreyaSans-Light.ttf в предыдущем разделе. Файл сохранён в архиве в каталоге font_files. Это означает, что путь, который нужно указать в параметре $entries , будет font_files/AlegreyaSans-Light.ttf, а не просто AlegreyaSans-Light.ttf.

Структура каталогов и файлов будет сохранена во время извлечения, и файлы будут извлечены в соответствующие каталоги.

Источник

Читайте также:  Javascript проверка на скрипт
Оцените статью