Работа с zip архивами. Нативный класс php ZipArchive

17.06.2018

Класс обертка для создания zip архивов на php используя ZipArchive

Есть пара моментов:

  1. Передаваемая директория не должна иметь слеша на конце

    1
    soZip::zipDir($sPath.'out', $sPath.'out/result2.zip');

  2. Столкнулся с проблемой на Centos 6.9 все кириллические имена файлов заменялись иероглифами.
    Для решения проблемы с кодировкой достаточно добавить:

    1
    $localPath = iconv('utf-8', 'cp866', $localPath);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
* Zip
*/
class soZip
{
  /**
  * Add files and sub-directories in a folder to zip file.
  * @param string $folder
  * @param ZipArchive $zipFile
  * @param int $exclusiveLength Number of text to be exclusived from the file path.
  */
  private static function folderToZip($folder, &$zipFile, $exclusiveLength)
  {
    $handle = opendir($folder);
    while (false !== $f = readdir($handle))
    {
      if ($f != '.' && $f != '..')
      {
        $filePath = "$folder/$f";
        // Remove prefix from file path before add to zip.
        $localPath = substr($filePath, $exclusiveLength);
        if (is_file($filePath))
        {
          $localPath = iconv('utf-8', 'cp866', $localPath);
          $zipFile->addFile($filePath, $localPath);
        }
        elseif (is_dir($filePath))
        {
          // Add sub-directory.
          $localPath = iconv('utf-8', 'cp866', $localPath);
          $zipFile->addEmptyDir($localPath);
          self::folderToZip($filePath, $zipFile, $exclusiveLength);
        }
      }
    }
    closedir($handle);
  }
 
  /**
  * Zip a folder (include itself).
  * Usage:
  *   soZip::zipDir('/path/to/sourceDir', '/path/to/out.zip');
  *
  * @param string $sourcePath Path of directory to be zip.
  * @param string $outZipPath Path of output zip file.
  */
  public static function zipDir($sourcePath, $outZipPath)
  {
    $pathInfo = pathInfo($sourcePath);
    $parentPath = $pathInfo['dirname'];
    $dirName = $pathInfo['basename'];
 
    $z = new ZipArchive();
    $z->open($outZipPath, ZIPARCHIVE::CREATE);
    $z->addEmptyDir($dirName);
    self::folderToZip($sourcePath, $z, strlen("$parentPath/"));
    $z->close();
  }
}


Категории: PHP, Class, -Памятка-
Яндекс.Метрика