Класс обертка для создания zip архивов на php используя ZipArchive
Работа с zip архивами. Нативный класс php ZipArchive
17.06.2018
Есть пара моментов:
-
Передаваемая директория не должна иметь слеша на конце
1soZip::zipDir(
$sPath
.
'out'
,
$sPath
.
'out/result2.zip'
);
-
Столкнулся с проблемой на 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(); } } |