Разработка PHP скрипта для извлечения файлов из zip архива

Владимир | | PHP.

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

Напомню, что для работы с архивом необходимо создать объект типа ZipArchive. С помощью методов этого объекта можно добавлять/удалять/извлекать файлы, получать информацию об архиве и т.д.

Извлечение выполняется в три этапа:
1) открываем архив (с помощью метода open(…));
2) извлекаем файлы (метод extractTo(…));
3) закрываем архив (метод close()).

Теперь посмотрим пример:

<?php
//папка с архивом
$archive_dir = "E:/archiveFolder/";
//папка в которой будут размещены файлы архива
$dest_dir = "E:/destFolder/";

//открываем zip архив
$zip = new ZipArchive();
//имя файла архива
$fileName = $archive_dir."backup_6_11_2007_08_11_09.zip";
if ($zip->open($fileName) !== true) {
	fwrite(STDERR, "Error while openning archive file");
	exit(1);
}

//читаем сведения об архиве
fwrite(STDOUT, "Number of files: ".$zip->numFiles."\n");
fwrite(STDOUT, "status: ".$zip->status."\n");
fwrite(STDOUT, "statusSys: ".$zip->statusSys."\n");
fwrite(STDOUT, "filename: ".$zip->filename."\n");
fwrite(STDOUT, "comment: ".$zip->comment."\n");

//извлекаем файлы
$zip->extractTo($dest_dir);

//закрываем архив
$zip->close();

fwrite(STDOUT, "Files extracted\n");

exit(0);
?>

Как видите, скрипт достаточно простой.
В переменных $archive_dir, $dest_dir, $fileName мы задаем имя папки с архивом, имя папки, в которую будут распакованы файлы, и имя архива (предполагается, что архив находится в папке $archive_dir).

После этого мы открываем архив (строка 11). Обратите внимание, что здесь используется тот же метод open(), что и при создании архива, но константа ZIPARCHIVE::CREATE не указывается. Мы собираемся что-то извлечь из архива, значит, он должен существовать.

Затем мы выводим информацию об архиве (строки 17-21) и распаковываем его (строка 24). Метод extractTo(…) принимает только два параметра. Первый – имя папки, в которую будет извлечено содержимое архива. Второй (необязательный) – имена объектов, которые необходимо извлечь. В нашем примере второй параметр не задан. Это означает, что будет распаковано все содержимое архива.

После окончания работы с архивом его необходимо закрыть, что мы и сделали в строке 27.

Запустить скрипт можно командой:
php путь_к_папке_со_скриптом\имя_скрипта.php

Если вы все сделали правильно, то в папке “E:/destFolder/” вы найдете извлеченные файлы.

Постовой
Очень полезная вещь в доме — makita hr 2440

  • Pingback: Блог web-мастера » Работа с архивами средствами PHP()

  • Pingback: Блог web-мастера » Архив сайта » Работа с архивами средствами PHP()

  • Shevron

    Как сделать так, чтобы папки из архива также извлекались?

    • Они должны извлекаться. Напишите, пожалуйста, какие ошибки возникают.

      • Shevron

        Ошибка исчезла, но раньше выводил ошибку извлечения файла.

        • Может раньше прав на запись в папку не было?

  • Shevron

    Как сделать так, чтобы папки из архива также извлекались?

    • Они должны извлекаться. Напишите, пожалуйста, какие ошибки возникают.

      • Shevron

        Ошибка исчезла, но раньше выводил ошибку извлечения файла.

        • Может раньше прав на запись в папку не было?

  • Shevron

    Да, так и есть. Хостинг работает только с правами 777 на каждую папку.

  • Shevron

    Да, так и есть. Хостинг работает только с правами 777 на каждую папку.

  • Алексей

    А почему я немогу открыть файл…..
    Например я скачал программу открываю через Winrar всё номрально но тот файл который мне нужно открыть он окрываеться и там как текстовой документ…..
    Помогите пожалуйста….

    • Вы извлекли файл из архива? Или кликнули по нему прямо в окне Winrar?

      Если в архиве находится программа, то её нужно извлечь, проверить расширение (правый клик, Свойства), после этого запускать. И, конечно, проверить антивирусом.

  • А почему я немогу открыть файл…..
    Например я скачал программу открываю через Winrar всё номрально но тот файл который мне нужно открыть он окрываеться и там как текстовой документ…..
    Помогите пожалуйста….

    • Вы извлекли файл из архива? Или кликнули по нему прямо в окне Winrar?

      Если в архиве находится программа, то её нужно извлечь, проверить расширение (правый клик, Свойства), после этого запускать. И, конечно, проверить антивирусом.

  • Игорь

    Допустим, в архиве есть только один файл. Как параллельно с его извлечением получить в отдельную переменную еще его полное имя?

  • Nikita

    Почему то при извлечении архива в котором содержатся файлы с русскими именами.
    Имена файлов называются не в нормальной кодировке. Как это можно исправить. 

    • В какой именно кодировке записаны имена файлов?
      Если я не ошибаюсь, UTF-8 не поддерживается.
      Попробуйте при сохранении файла использовать CP1251 (изменить кодировку можно с помощью mb_convert_encoding).

      • Nikita

        Решил по другому использовал функцию system. А там вызывал системный архиватор.

        • Если есть возможность использовать system, то такой вариант однозначно лучше. Вы практически наверняка выиграете по производительности.

  • lamer

    а возможно ли вместо ссылки на компьютере прописать ссылку на архив в интернете?