Как упаковать картинки в ZIP архив

Допустим у нас есть нода с полем, в которое загружаются картинки, необходимо упаковать все картинки из этого поля в ZIP архив и сохранить в файловую систему. Для этого напишем функцию, которую потом можно будет вызвать в нужном месте:

/**
 * Create a zip archive, which contains images.
 *
 * @param object $node
 *   The node object.
 *
 * @return bool|stdClass
 *   Zip archive, if was created, FALSE otherwise.
 */
function _example_zip_create($node) {
  if (module_exists('entity') && $wrapper = entity_metadata_wrapper('node', $node)) {

    // Директория, в которую сохранится архив.
    $directory = 'public://example';

    // Если не удалось создать директорию, записываем сообщение с ошибкой.
    if (!file_prepare_directory($directory, FILE_MODIFY_PERMISSIONS | FILE_CREATE_DIRECTORY)) {
      watchdog('example_zip', 'Failed to create %directory.', array('%directory' => $directory), WATCHDOG_ERROR);
      return FALSE;
    }

    // Имя ZIP архива, которое транслитилируется, поэтому необходимо добавить зависимость от модулуя transliteration в .info.
    $filename = transliteration_clean_filename($node->nid . '_' . $node->title . '_' . '.zip');

    // Название поля, в которое загружаются картинки.
    $field_name = 'field_images';

    // Проверяем, есть ли у ноды поле.
    if (isset($wrapper->{$field_name})) {

      // Создаем архив.
      $zip = new ZipArchive();

      // Создаем полный путь к архиву.
      $path = file_create_filename($filename, $directory);

      // Если не удалось открыть архив, записваем сообщение с ошибкой.
      if ($zip->open(drupal_realpath($path), ZIPARCHIVE::CREATE) !== TRUE) {
        watchdog('example_zip', 'Error while creating zip archive', array(), WATCHDOG_ERROR);
        return FALSE;
      }

      // Добавляем картинки в архив.
      foreach ($wrapper->{$field_name} as $item) {
        $image = $item->value();
        $zip->addFile(drupal_realpath($image['uri']), $image['filename']);
      }

      // Заканчиваем работу  с архивом.
      $zip->close();

      // Сохраняем архив в файловую систему.
      $file = new stdClass();
      $file->fid = NULL;
      $file->uri = $path;
      $file->filename = drupal_basename($path);
      $file->filemime = file_get_mimetype($path);
      $file->status = FILE_STATUS_PERMANENT;
      file_save($file);
      file_usage_add($file, 'example', 'node', $node->nid);

      return $file;
    }
  }
  return FALSE;
}

Если необходимо добавить картинки с использованием стилей изображений, необходимо воспользоваться следующим кодом:

foreach ($wrapper->{$field_name} as $item) {
  $image = $item->value();

  // Название стиля изображения.
  $style_name = 'some_image_style_name';
  if (($uri = image_style_path($style_name, $image['uri'])) && ($style = image_style_load($style_name))  && image_style_create_derivative($style, $image['uri'], $uri)) {
    $zip->addFile(drupal_realpath($uri), $image['filename']);
  }
}

Комментарии (0)