Большие возможности маленького сайта (Работа с Zip архивами)

Автор статьи: Феськов Кузьма
Сайт Автора: php.russofile.ru
E-mail Автора: kuzma@russofile.ru
Дата публикации: 26.04.2006


Возвратные функции.

Возвратные функции – специфические аргументы, потому что их значение – название функции. Эти функции имеют строгое описание и которого вы должны придерживаться. Действия, которые могут производить эти функции разграничены. Внутренний алгоритм функции может быть любым, но он должен уважать определенный список параметров и возвращаемых значений. Однако, функция должна уважать основную обработку метода, некоторое действия могут с этим столкнуться (например, удаление файла архива в течении процесса).

PCLZIP_CB_PRE_EXTRACT

Этот дополнительный аргумент дает вам возможность выполнить определенную функцию перед тем как распаковать файл. Эта функция может изменять процесс извлечения файла двумя способами:

  • изменить путь или имя файла;
  • пропустить извлечение файла.

Чтобы быть точными: эта функция применяется после дополнительных аргументов PCLZIP_OPT_PATH, PCLZIP_OPT_ADD_PATH, PCLZIP_OPT_REMOVE_PATH или PCLZIP_OPT_REMOVE_ALL_PATH, но перед конкретной проверкой (файл не существует, файла нет в текущей папке, и так далее).

Функция должна принимать в качестве аргументов следующие параметры:

    function myCallBack($p_event, &$p_header)
    {
    [... ваш код ...]
    return $result;
    }

Когда метод вызывает возвратную функцию, он делает это следующим образом:

  • $p_event – идентификатор аргумента (здесь PCLZIP_CB_PRE_EXTRACT). Это используется, когда необходимо использовать одну и ту же функцию для разных возвратных действий.
  • $p_header – описание файла, который будте извлечен. Это массив, который содержит информацию в нескольких полях. Наиболее интересный параметр – имя файла в архиве и имя файла, под которым он будет извлечен. Все поля массива описаны в главе “Возвращаемые данные”.

Функция может менять только поле “filename” (имя файла) в массиве $p_header. Это дает вам вам возможность изменить имя файла после распаковки. Все остальные параметры массива только для чтения.

Функция должна возвратить 2, 1 или 0 ($result). Другие значения зарезервированы на будущее. 1 – означает возобновление извлечения файла (возможно, с измененным именем файла). 0 – пропустить файл, переходим к следующему файлу. 2 – пропустить файл и остановить распаковку, даже если не достигнут конец архива.

  function myPreExtractCallBack($p_event, &$p_header)
  {
    $info = pathinfo($p_header['filename']);
    // ----- пропускаем все .gif файлы
    if ($info['extension'] == 'gif') {
      return 0;
    }
    // ----- jpg файлы распаковываем в папку 'images'
    else if ($info['extension'] == 'jpg') {
      $p_header['filename'] = 'images/'.$info['basename'];
      return 1;
    }
    // ----- остальные файлы просто распаковываем
    else {
      return 1;
    }
  }

  $list = $archive->extract(PCLZIP_OPT_PATH, 'folder',);
                            PCLZIP_CB_PRE_EXTRACT, 'myPreExtractCallBack');



PCLZIP_CB_POST_EXTRACT

Этот дополнительный аргумент дает вам возможность добавить постобработку файлов во время распаковки, вызывая функцию возврата после извлечения каждого файла. Эта функция не может изменить процесс извлечения, но может выполнить определенные действия с распакованным файлом, например, переименование или удаление.

Функция должна принимать в качестве аргументов следующие параметры:

    function myCallBack($p_event, &$p_header)
    {
    [... ваш код ...]
    return $result;
    }
  • $p_event – идентификатор аргумента (здесь PCLZIP_CB_POST_EXTRACT). Это используется, когда необходимо использовать одну и ту же функцию для разных возвратных действий.
  • $p_header – описание файла, который будте извлечен. Это массив, который содержит информацию в нескольких полях. Наиболее интересный параметр – имя файла в архиве и имя файла, под которым он будет извлечен. Все поля массива описаны в главе “Возвращаемые данные”. Функция не может менять этот массив, потому что извлечение уже произошло.

Функция должна возвратить 1 или 2 ($result). Остальные значения зарезервированы на будущее. 1 – извлекаем дальше. 2 – останавливаем извлечение.

  function myPreExtractCallBack($p_event, &$p_header) { ... }

  function myPostExtractCallBack($p_event, &$p_header)
  {
    // ----- проверяем успешность распаковки
    if ($p_header['status'] == 'ok') {
      // ----- читаем файл
      readfile($p_header['filename']);
      // ----- удаляем файл
      unlink($p_header['filename'])
    }
  }

  $list = $archive->extract(PCLZIP_OPT_PATH, 'temp',
                            PCLZIP_CB_PRE_EXTRACT, 'myPreExtractCallBack',
                            PCLZIP_CB_POST_EXTRACT, 'myPostExtractCallBack');

Таким образом, эта функция производит действия над распакованным файлом, а затем удаляет его.

Примечание, в данном конкретном примере логичнее использовать параметр PCLZIP_OPT_EXTRACT_IN_OUTPUT, так как он не создает промежуточного файла.

PCLZIP_CB_PRE_ADD

Этот параметр позволяет вам добавить обработку файла перед помещением его в архив. Вы можете, например:

  • изменить путь или имя файла;
  • пропустить извлечение файла.

Чтобы быть точными: эта функция применяется после дополнительных аргументов PCLZIP_OPT_PATH, PCLZIP_OPT_ADD_PATH, PCLZIP_OPT_REMOVE_PATH или PCLZIP_OPT_REMOVE_ALL_PATH, но перед конкретной проверкой (файл не существует, файла нет в текущей папке, и так далее).

Функция должна принимать в качестве аргументов следующие параметры:

    function myCallBack($p_event, &$p_header)
    {
    [... ваш код ...]
    return $result;
    }

Когда метод вызывает возвратную функцию, он делает это следующим образом:

  • $p_event – идентификатор аргумента (здесь PCLZIP_CB_PRE_ADD). Это используется, когда необходимо использовать одну и ту же функцию для разных возвратных действий.
  • $p_header – описание файла, который будте извлечен. Это массив, который содержит информацию в нескольких полях. Наиболее интересный параметр – имя файла в архиве и имя файла, под которым он будет добавлен. Все поля массива описаны в главе “Возвращаемые данные”.

Функция может менять только поле “filename” (имя файла) в массиве $p_header. Это дает вам вам возможность изменить имя файла перед запаковкой. Все остальные параметры массива только для чтения.

Функция должна возвратить 1 или 0 ($result). Другие значения зарезервированы на будущее. 1 – означает возобновление добавления файла (возможно, с измененным именем файла). 0 – пропустить файл, переходим к следующему файлу.

  function myPreAddCallBack($p_event, &$p_header)
  {
    $info = pathinfo($p_header['stored_filename']);
    // ----- пропускаем .bak файлы
    if ($info['extension'] == 'bak') {
      return 0;
    }
    // ----- jpg файлы будут добавляться в папку 'images'
    else if ($info['extension'] == 'jpg') {
      $p_header['stored_filename'] = 'images/'.$info['basename'];
      return 1;
    }
    // ----- остальные файлы просто добавляются
    else {
      return 1;
    }
  }

  $list = $archive->add(PCLZIP_CB_PRE_ADD, 'myPreAddCallBack');


PCLZIP_CB_POST_ADD

Этот параметр позволяет запустить нужную функцию после добавления файла. Эта функция не может повлиять на добавление файла, но может произвести действия с файлом на диске, например переименовать или удалить.

Функция должна принимать в качестве аргументов следующие параметры:

    function myCallBack($p_event, &$p_header)
    {
    [... ваш код ...]
    return $result;
    }

  • $p_event – идентификатор аргумента (здесь PCLZIP_CB_POST_ADD). Это используется, когда необходимо использовать одну и ту же функцию для разных возвратных действий.
  • $p_header – описание файла, который будте извлечен. Это массив, который содержит информацию в нескольких полях. Наиболее интересный параметр – имя файла на диске и имя файла, под которым он будет добавлен. Все поля массива описаны в главе “Возвращаемые данные”. Функция не может менять этот массив, потому что добавление уже произошло.

Функция должна возвратить 1. Остальные значения зарезервированы на будущее.

  function myPostAddCallBack($p_event, &$p_header)
  {
    // ----- проверяем удачное добавление
    if ($p_header['status'] == 'ok') {
      // ----- перемещаем файлы в корзину
      rename($p_header['filename'], 'trash/'.$p_header['filename'])
    }
  }

  $list = $archive->extract(PCLZIP_CB_POST_ADD, 'myPostAddCallBack');