################################################################
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
为小数
}
################################################################