压缩文件封装的方法

################################################################
function zip( $dir_path , $zipName )
{
$relationArr = [ $dir_path => [
'originName' => $dir_path ,
'is_dir' => true ,
'children' => []
]];
modifiyFileName( $dir_path , $relationArr [ $dir_path ][ 'children' ]);
$zip = new ZipArchive();
$zip ->open( $zipName , ZipArchive:: CREATE );
zipDir( array_keys ( $relationArr )[ 0 ], '' , $zip , array_values ( $relationArr )[ 0 ][ 'children' ]);
$zip ->close();
restoreFileName( array_keys ( $relationArr )[ 0 ], array_values ( $relationArr )[ 0 ][ 'children' ]);
return true ;
}

function zipDir( $real_path , $zip_path , & $zip , $relationArr )
{
$sub_zip_path = empty ( $zip_path ) ? '' : $zip_path . DS ;
if ( is_dir ( $real_path )) {
foreach ( $relationArr as $k => $v ) {
if ( $v [ 'is_dir' ]) { // 是文件夹
$zip ->addEmptyDir( $sub_zip_path . $v [ 'originName' ]);
zipDir( $real_path . DS . $k , $sub_zip_path . $v [ 'originName' ], $zip , $v [ 'children' ]);
} else { // 不是文件夹
$zip ->addFile( $real_path . DS . $k , $sub_zip_path . $k );
$zip ->deleteName( $sub_zip_path . $v [ 'originName' ]);
$zip ->renameName( $sub_zip_path . $k , $sub_zip_path . $v [ 'originName' ]);
}
}
}
}

function modifiyFileName( $path , & $relationArr )
{
if (! is_dir ( $path ) || ! is_array ( $relationArr )) {
return false ;
}
if ( $dh = opendir ( $path )) {
$count = 0 ;
while (( $file = readdir ( $dh )) !== false ) {
if ( in_array ( $file , [ '.' , '..' , null ])) continue ; // 无效文件,重来
if ( is_dir ( $path . DS . $file )) {
$newName = md5 ( rand ( 0 , 99999 ) . rand ( 0 , 99999 ) . rand ( 0 , 99999 ) . microtime () . 'dir' . $count );
$relationArr [ $newName ] = [
'originName' => iconv ( 'UTF-8' , 'GBK//IGNORE' , $file ),
'is_dir' => true ,
'children' => []
];
rename ( $path . DS . $file , $path . DS . $newName );
modifiyFileName( $path . DS . $newName , $relationArr [ $newName ][ 'children' ]);
$count ++;
} else {
$extension = strchr ( $file , '.' );
$newName = md5 ( rand ( 0 , 99999 ) . rand ( 0 , 99999 ) . rand ( 0 , 99999 ) . microtime () . 'file' . $count );
$relationArr [ $newName . $extension ] = [
'originName' => iconv ( 'UTF-8' , 'GBK//IGNORE' , $file ),
'is_dir' => false ,
'children' => []
];
rename ( $path . DS . $file , $path . DS . $newName . $extension );
$count ++;
}
}
}
}

function restoreFileName( $path , $relationArr )
{
foreach ( $relationArr as $k => $v ) {
if (! empty ( $v [ 'children' ])) {
restoreFileName( $path . DS . $k , $v [ 'children' ]);
rename ( $path . DS . $k , iconv ( 'UTF-8' , 'GBK//IGNORE' , $path . DS . $v [ 'originName' ]));
} else {
rename ( $path . DS . $k , iconv ( 'UTF-8' , 'GBK//IGNORE' , $path . DS . $v [ 'originName' ]));
}
}
}

// 解压压缩包
function get_zip_originalsize( $filename , $path )
{
// 先判断待解压的文件是否存在
if (! file_exists ( $filename )) {
die ( " 文件 $filename 不存在! " );
}
$starttime = explode ( ' ' , microtime ()); // 解压开始的时间

// 将文件名和路径转成 windows 系统默认的 gb2312 编码,否则将会读取不到
$filename = iconv ( "utf-8" , "gb2312" , $filename );
$path = iconv ( "utf-8" , "gb2312" , $path );
// 打开压缩包
$resource = zip_open ( $filename );
$i = 1 ;
// 遍历读取压缩包里面的一个个文件
while ( $dir_resource = zip_read ( $resource )) {
// 如果能打开则继续
if ( zip_entry_open ( $resource , $dir_resource )) {
// 获取当前项目的名称 , 即压缩包里面当前对应的文件名
$file_name = $path . zip_entry_name ( $dir_resource );
// 以最后一个 “/” 分割 , 再用字符串截取出路径部分
$file_path = substr ( $file_name , 0 , strrpos ( $file_name , "/" ));
// 如果路径不存在,则创建一个目录, true 表示可以创建多级目录
if (! is_dir ( $file_path )) {
mkdir ( $file_path , 0777 , true );
}
// 如果不是目录,则写入文件
if (! is_dir ( $file_name )) {
// 读取这个文件
$file_size = zip_entry_filesize ( $dir_resource );
// 最大读取 6M ,如果文件过大,跳过解压,继续下一个
if ( $file_size < ( 1024 * 1024 * 30 )) {
$file_content = zip_entry_read ( $dir_resource , $file_size );
file_put_contents ( $file_name , $file_content );
} else {
echo "<p> " . $i ++ . " 此文件已被跳过,原因:文件过大, -> " . iconv ( "gb2312" , "utf-8" , $file_name ) . " </p>" ;
}
}
// 关闭当前
zip_entry_close ( $dir_resource );
}
}
// 关闭压缩包
zip_close ( $resource );
$endtime = explode ( ' ' , microtime ()); // 解压结束的时间
$thistime = $endtime [ 0 ] + $endtime [ 1 ] - ( $starttime [ 0 ] + $starttime [ 1 ]);
return $thistime = round ( $thistime , 3 ); // 保留 3 为小数

}

################################################################

猜你喜欢

转载自blog.csdn.net/huyhuylop/article/details/80776000