其实压缩文件就是创建一个通过某种压缩技术生成的文件夹,然后将想要压缩的文件添加进去;
而解压缩文件就是将这个压缩文件夹里的文件取出来,到指定的地方,而这个过程就是相当但是于将这个文件夹里的文件copy到指定地方;
而我们在压缩和解压缩的过程中难免少不了要处理含有中文名的文件,在压缩文件的时候我们不必为其烦忧,但是解压缩文件的时候,你或许会想到ziparchive类里的extracto方法,但是这并解决不了中文名文件的问题,这是我们就需要需要用到这些函数:ziparchive里的numfile(获取文件数)和getnameindex(获取索引对应的文件名);然而这个方法在copy行不通,因为即使用ziparchive类打开了zip文件,但就此想要通过copy来复制zip包里的文件的话是不可行的!
好在天无绝人之路,PHP的API提供了zip_file来进行操作zip包:
1.首先利用$zip=zip_open("example.zip")来打开zip包,成功返回zip里的目录,失败返回false
2.然后通过$zipfile=zip_read($zip)来一次读取zip包里的每一个文件柄(此时还不能得到文件里的内容),只有从上往下的顺序!可以通过zip_entry_filename($zipfile)来获取其名字。成功则返回文件柄,失败返回用false,此处用while可以遍历各个条目
3.再通过$zipfilentry=zip_entry_open($zipfile)来打开这个文件柄,成功则返回打开的文件柄,失败返回false
4.然后通过$zipfilentrycon=$zip_entry_read($zipfilentry)来读取文件的内容,成功则返回内容,失败则返回false
5.此时再加入对于文件的操作完成复制到另一个文件里: $file=fopen(iconv("utf-8","gb2312","测试.txt"),"w");
fputs($file,$zipfilentrycon);
fclose($file);
6.关闭文件柄zip_entry_close($zipfilentry),
7.关闭打开的zip文件zip_close($zip)
<?php
//zip之压缩一个文件
$zip=new ZipArchive(); //创建zip工具类
$zip->open("C:/orz.zip",$zip::CREATE); //利用这个类里面的方法创建zip包并打开,,注意绝对路径为/
$zip->addFile(iconv("utf-8","gb2312","测试.txt"),iconv("utf-8","gb2312","测试.txt")); //往包中添加文件
$zip->close(); //关闭这个包
?>
<?php
//zip之压缩多个文件
$file=array("测试.txt","独舞红尘.txt");
$zip=new ZipArchive();
$zip->open("test2.zip",$zip::CREATE);
foreach($file as $value){
$zip->addFile(iconv("utf-8","gb2312",$value),iconv("utf-8","gb2312",$value));
}
$zip->close();
?>
<?php
//zip之压缩目录与文件
function addFileToZip($path,$zip){
$handler=opendir($path); //打开当前文件夹由$path指定。
while(($filename=readdir($handler))!==false){
if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..’,不要对他们进行操作
if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
addFileToZip($path."/".$filename, $zip);
}else{ //将文件加入zip对象
$zip->addFile($path."/".$filename);//该函数第二个参数是可选的,用来指定文件的名称,如果不选,则用basename()来代替
}
}
}
@closedir($path);//关闭打开的目录
}
$zip=new ZipArchive();
if($zip->open('rsa.zip', ZipArchive::OVERWRITE|ZipArchive::CREATE)=== TRUE){//如果只用ZipArchive::OVERWRITE那么如果指定目标存在的话就会复写,否则返回错误9,而两个都用则会避免这个错误
addFileToZip('lala', $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法,注意"\"是转移字符,"/"不是
$zip->close(); //关闭处理的zip文件
}
?>
<?php
//zip之解压目录与文件
class Unzip{
public function __construct(){
//init code here...
header("content-type:text/html;charset=utf8");
}
/**
* 解压文件到指定目录
*
* @param string zip压缩文件的路径
* @param string 解压文件的目的路径
* @param boolean 是否以压缩文件的名字创建目标文件夹
* @param boolean 是否重写已经存在的文件
*
* @return boolean 返回成功 或失败
*/
public function unzip($src_file, $dest_dir=false, $create_zip_name_dir=true, $overwrite=true){
if ($zip = zip_open($src_file)){
if ($zip){
$splitter = ($create_zip_name_dir === true) ? "." : "/";
if($dest_dir === false){
$dest_dir = substr($src_file, 0, strrpos($src_file, $splitter))."/";
}
// 如果不存在 创建目标解压目录
$this->create_dirs($dest_dir);
// 对每个文件进行解压
while ($zip_entry = zip_read($zip)){
// 文件不在根目录
$pos_last_slash = strrpos(zip_entry_name($zip_entry), "/");
if ($pos_last_slash !== false){
// 创建目录 在末尾带 /
$this->create_dirs($dest_dir.substr(zip_entry_name($zip_entry), 0, $pos_last_slash+1));
}
// 打开包
if (zip_entry_open($zip,$zip_entry,"r")){
// 文件名保存在磁盘上
$file_name = $dest_dir.zip_entry_name($zip_entry);
// 检查文件是否需要重写
if ($overwrite === true || $overwrite === false && !is_file($file_name)){
// 读取压缩文件的内容
$fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
@file_put_contents($file_name, $fstream);
// 设置权限
chmod($file_name, 0777);
echo "save: ".$file_name."<br />";
}
// 关闭入口
zip_entry_close($zip_entry);
}
}
// 关闭压缩包
zip_close($zip);
}
}else{
return false;
}
return true;
}
/**
* 创建目录
*/
public function create_dirs($path){
if (!is_dir($path)){
$directory_path = "";
$directories = explode("/",$path);
array_pop($directories);
foreach($directories as $directory){
$directory_path .= $directory."/";
if (!is_dir($directory_path)){
mkdir($directory_path);
chmod($directory_path, 0777);
}
}
}
}
}
/*
using:
$z = new Unzip();
$z->unzip("./bootstrap-3.3.4.zip",'./unzipres/', true, false);
*/
$z=new Unzip();
$z->unzip("orzzzzzz.zip","d/",true,false);
?>