PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
本文实例讲述了PHP实现将多个文件压缩成zip格式并下载到本地的方法。分享给大家供大家参考,具体如下:
废话不多说,直接上代码
//这里需要注意该目录是否存在,并且有创建的权限
$zipname='path/test.zip'
//这是要打包的文件地址数组
$files=array("mypath/test1.txt","mypath/test2.pdf");
$zip=newZipArchive();
$res=$zip->open($zipname,ZipArchive::CREATE);
if($res===TRUE){
foreach($filesas$file){
//这里直接用原文件的名字进行打包,也可以直接命名,需要注意如果文件名字一样会导致后面文件覆盖前面的文件,所以建议重新命名
$new_filename=substr($file,strrpos($file,'/')+1);
$zip->addFile($file,$new_filename);
}
}
//关闭文件
$zip->close();
//这里是下载zip文件
header("Content-Type:application/zip");
header("Content-Transfer-Encoding:Binary");
header("Content-Length:".filesize($zipname));
header("Content-Disposition:attachment;filename=\"".basename($zipname)."\"");
readfile($zipname);
exit;
附:这里再为大家提供一个zip压缩类:
GetFileList($dir);
}
if((!empty($dir))&&(!is_array($dir))&&(file_exists($dir)))chdir($dir);
elsechdir($curdir);
if(count($filelist)>0)
{
foreach($filelistas$filename)
{
if(is_file($filename))
{
$fd=fopen($filename,"r");
$content=fread($fd,filesize($filename));
fclose($fd);
if(is_array($dir))$filename=basename($filename);
$this->addFile($content,$filename);
}
}
$out=$this->file();
chdir($curdir);
$fp=fopen($zipfilename,"w");
fwrite($fp,$out,strlen($out));
fclose($fp);
}
return1;
}
elsereturn0;
}
functionGetFileList($dir)
{
if(file_exists($dir))
{
$args=func_get_args();
$pref=$args[1];
$dh=opendir($dir);
while($files=readdir($dh))
{
if(($files!=".")&&($files!=".."))
{
if(is_dir($dir.$files))
{
$curdir=getcwd();
chdir($dir.$files);
$file=array_merge($file,$this->GetFileList("","$pref$files/"));
chdir($curdir);
}
else$file[]=$pref.$files;
}
}
closedir($dh);
}
return$file;
}
var$datasec=array();
var$ctrl_dir=array();
var$eof_ctrl_dir="x50x4bx05x06x00x00x00x00";
var$old_offset=0;
/**
*ConvertsanUnixtimestamptoafourbyteDOSdateandtimeformat(date
*inhightwobytes,timeinlowtwobytesallowingmagnitudecomparison).
*
*@paramintegerthecurrentUnixtimestamp
*
*@returnintegerthecurrentdateinafourbyteDOSformat
*
*@accessprivate
*/
functionunix2DosTime($unixtime=0){
$timearray=($unixtime==0)?getdate():getdate($unixtime);
if($timearray['year']<1980){
$timearray['year']=1980;
$timearray['mon']=1;
$timearray['mday']=1;
$timearray['hours']=0;
$timearray['minutes']=0;
$timearray['seconds']=0;
}//endif
return(($timearray['year']-1980)<<25)|($timearray['mon']<<21)|($timearray['mday']<<16)|
($timearray['hours']<<11)|($timearray['minutes']<<5)|($timearray['seconds']>>1);
}//endofthe'unix2DosTime()'method
/**
*Adds"file"toarchive
*
*@paramstringfilecontents
*@paramstringnameofthefileinthearchive(maycontainsthepath)
*@paramintegerthecurrenttimestamp
*
*@accesspublic
*/
functionaddFile($data,$name,$time=0)
{
$name=str_replace('','/',$name);
$dtime=dechex($this->unix2DosTime($time));
$hexdtime='x'.$dtime[6].$dtime[7]
.'x'.$dtime[4].$dtime[5]
.'x'.$dtime[2].$dtime[3]
.'x'.$dtime[0].$dtime[1];
eval('$hexdtime="'.$hexdtime.'";');
$fr="x50x4bx03x04";
$fr.="x14x00";//verneededtoextract
$fr.="x00x00";//genpurposebitflag
$fr.="x08x00";//compressionmethod
$fr.=$hexdtime;//lastmodtimeanddate
//"localfileheader"segment
$unc_len=strlen($data);
$crc=crc32($data);
$zdata=gzcompress($data);
$c_len=strlen($zdata);
$zdata=substr(substr($zdata,0,strlen($zdata)-4),2);//fixcrcbug
$fr.=pack('V',$crc);//crc32
$fr.=pack('V',$c_len);//compressedfilesize
$fr.=pack('V',$unc_len);//uncompressedfilesize
$fr.=pack('v',strlen($name));//lengthoffilename
$fr.=pack('v',0);//extrafieldlength
$fr.=$name;
//"filedata"segment
$fr.=$zdata;
//"datadescriptor"segment(optionalbutnecessaryifarchiveisnot
//servedasfile)
$fr.=pack('V',$crc);//crc32
$fr.=pack('V',$c_len);//compressedfilesize
$fr.=pack('V',$unc_len);//uncompressedfilesize
//addthisentrytoarray
$this->datasec[]=$fr;
$new_offset=strlen(implode('',$this->datasec));
//nowaddtocentraldirectoryrecord
$cdrec="x50x4bx01x02";
$cdrec.="x00x00";//versionmadeby
$cdrec.="x14x00";//versionneededtoextract
$cdrec.="x00x00";//genpurposebitflag
$cdrec.="x08x00";//compressionmethod
$cdrec.=$hexdtime;//lastmodtime&date
$cdrec.=pack('V',$crc);//crc32
$cdrec.=pack('V',$c_len);//compressedfilesize
$cdrec.=pack('V',$unc_len);//uncompressedfilesize
$cdrec.=pack('v',strlen($name));//lengthoffilename
$cdrec.=pack('v',0);//extrafieldlength
$cdrec.=pack('v',0);//filecommentlength
$cdrec.=pack('v',0);//disknumberstart
$cdrec.=pack('v',0);//internalfileattributes
$cdrec.=pack('V',32);//externalfileattributes-'archive'bitset
$cdrec.=pack('V',$this->old_offset);//relativeoffsetoflocalheader
$this->old_offset=$new_offset;
$cdrec.=$name;
//optionalextrafield,filecommentgoeshere
//savetocentraldirectory
$this->ctrl_dir[]=$cdrec;
}//endofthe'addFile()'method
/**
*Dumpsoutfile
*
*@returnstringthezippedfile
*
*@accesspublic
*/
functionfile()
{
$data=implode('',$this->datasec);
$ctrldir=implode('',$this->ctrl_dir);
return
$data.
$ctrldir.
$this->eof_ctrl_dir.
pack('v',sizeof($this->ctrl_dir)).//total#ofentries"onthisdisk"
pack('v',sizeof($this->ctrl_dir)).//total#ofentriesoverall
pack('V',strlen($ctrldir)).//sizeofcentraldir
pack('V',strlen($data)).//offsettostartofcentraldir
"x00x00";//.zipfilecommentlength
}//endofthe'file()'method
}//endofthe'PHPZip'class
?>
用法:
$zipfiles=array("/root/pooy/test1.txt","/root/pooy/test2.txt");
$z=newPHPZip();
//$randomstr=random(8);
$zipfile=TEMP."/photocome_".$groupid.".zip";
$z->Zip($zipfiles,$zipfile);
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP操作zip文件及压缩技巧总结》、《php文件操作总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。