基于PHP如何实现打包zip并下载的功能?
Admin 2022-10-10 群英技术资讯 277 次浏览
在这篇文章中我们来了解一下“基于PHP如何实现打包zip并下载的功能?”,一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
$file_template = FCPATH.'canddata/cand_picture.zip';//在此之前你的项目目录中必须新建一个空的zip包(必须存在) $downname = $card.'.zip';//你即将打包的zip文件名称 $file_name = FCPATH.'canddata/'.$card.'.zip';//把你打包后zip所存放的目录 $result = copy( $file_template, $file_name );//把原来项目目录存在的zip复制一份新的到另外一个目录并重命名(可以在原来的目录) $zip = new ZipArchive();//新建一个对象 if ($zip->open($file_name, ZipArchive::CREATE) === TRUE) { //打开你复制过后空的zip包 $zip->addEmptyDir($card);//在zip压缩包中建一个空文件夹,成功时返回 TRUE, 或者在失败时返回 FALSE //下面是我的场景业务处理,可根据自己的场景需要去处理(我的是将所有的图片打包) $i = 1; foreach ($cand_photo as $key3 => $value3) { $file_ext = explode('.',$value3['cand_face']);//获取到图片的后缀名 $zip->addFromString($card.'/'.$card.'_'.$i.'.'.$file_ext[3] , file_get_contents($value3['cand_face']));//(图片的重命名,获取到图片的二进制流) $i++; } $zip->close(); $fp=fopen($file_name,"r"); $file_size=filesize($file_name);//获取文件的字节 //下载文件需要用到的头 Header("Content-type: application/octet-stream"); Header("Accept-Ranges: bytes"); Header("Accept-Length:".$file_size); Header("Content-Disposition: attachment; filename=$downname"); $buffer=1024; //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器) $file_count=0; //读取的总字节数 //向浏览器返回数据 如果下载完成就停止输出,如果未下载完成就一直在输出。根据文件的字节大小判断是否下载完成 while(!feof($fp) && $file_count<$file_size){ $file_con=fread($fp,$buffer); $file_count+=$buffer; echo $file_con; } fclose($fp); //下载完成后删除压缩包,临时文件夹 if($file_count >= $file_size) { unlink($file_name); } }
二、PHP实现大文件下载
此方法为大文件下载的实现,即使几个G也可实现本地的下载。可以测试一下,或者等你从中改进...
function downloadFile($filename){ //获取文件的扩展名 $allowDownExt=array ( 'rar','zip','png','txt','mp4','html'); //获取文件信息 $fileext=pathinfo($filename); //检测文件类型是否允许下载 if(!in_array($fileext['extension'],$allowDownExt)) { return false; } //设置脚本的最大执行时间,设置为0则无时间限制 set_time_limit(0); ini_set('max_execution_time', '0'); //通过header()发送头信息 //因为不知道文件是什么类型的,告诉浏览器输出的是字节流 header('content-type:application/octet-stream'); //告诉浏览器返回的文件大小类型是字节 header('Accept-Ranges:bytes'); //获得文件大小 //$filesize=filesize($filename);//(此方法无法获取到远程文件大小) $header_array = get_headers($filename, true); $filesize = $header_array['Content-Length']; //告诉浏览器返回的文件大小 header('Accept-Length:'.$filesize); //告诉浏览器文件作为附件处理并且设定最终下载完成的文件名称 header('content-disposition:attachment;filename='.basename($filename)); //针对大文件,规定每次读取文件的字节数为4096字节,直接输出数据 $read_buffer=4096; $handle=fopen($filename, 'rb'); //总的缓冲的字节数 $sum_buffer=0; //只要没到文件尾,就一直读取 while(!feof($handle) && $sum_buffer<$filesize) { echo fread($handle,$read_buffer); $sum_buffer+=$read_buffer; } //关闭句柄 fclose($handle); exit; }
三,PHP扩展类ZipArchive实现压缩Zip文件和文件打包下载
这是一个类,封装了方法,也可以尝试一下!
<?php /** * 关于文件压缩和下载的类 * @author tycell * @version 1.0 */ class zip_down{ protected $file_path; /** * 构造函数 * @param [string] $path [传入文件目录] */ public function __construct($path){ $this->file_path=$path; //要打包的根目录 } /** * 入口调用函数 * @return [type] [以二进制流的形式返回给浏览器下载到本地] */ public function index(){ $zip=new ZipArchive(); $end_dir=$this->file_path.date('Ymd',time()).'.zip';//定义打包后的包名 $dir=$this->file_path; if(!is_dir($dir)){ mkdir($dir); } if($zip->open($end_dir, ZipArchive::OVERWRITE) === TRUE){ ///ZipArchive::OVERWRITE 如果文件存在则覆盖 $this->addFileToZip($dir, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法 $zip->close(); } if(!file_exists($end_dir)){ exit("无法找到文件"); } header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Type: application/zip"); //zip格式的 header('Content-disposition: attachment; filename='.basename($end_dir)); //文件名 header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件 header('Content-Length:'.filesize($end_dir)); //告诉浏览器,文件大小 @readfile($end_dir); $this->delDirAndFile($dir,true);//删除目录和文件 unlink($end_dir);////删除压缩包 } /** * 文件压缩函数 需要开启php zip扩展 * @param [string] $path [路径] * @param [object] $zip [扩展ZipArchive类对象] */ protected function addFileToZip($path, $zip){ $handler = opendir($path); while (($filename=readdir($handler)) !== false) { if ($filename!= "." && $filename!=".."){ if(!is_dir($filename)){ $zip->addFile($path."/".$filename,$filename); //第二个参数避免将目录打包,可以不加 } } } @closedir($path); } /** * 删除文件函数 * @param [string] $dir [文件目录] * @param boolean $delDir [是否删除目录] * @return [type] [description] */ protected function delDirAndFile($path,$delDir=true){ $handle=opendir($path); if($handle){ while(false!==($item = readdir($handle))){ if($item!="."&&$item!=".."){ if(is_dir($path.'/'.$item)){ $this->delDirAndFile($path.'/'.$item, $delDir); }else{ unlink($path.'/'.$item); } } } @closedir($handle); if($delDir){return rmdir($path);} }else{ if(file_exists($path)){ return unlink($path); }else{ return FALSE; } } } }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
前言:总觉得手写sql没有提示很不方便,终于找到PHPstorm中操作数据库的方法,记录如下正文,创建两张表,如果要设置SET NULL,那么久必须允许为null,不能勾选not null。
php中 __clone的使用:1、用于对象复制。对象复制通过clone关键字来完成。2、__clone()方法不需要任何参数。3、在复制的同时,目标对象的某些属性与源对象的不同,可以在类里面定义一个__clone()方法。
php聚合式迭代器的介绍:1、实现其他迭代器功能的接口,相当于在其他迭代器上安装一个外壳,只有一种方法。2、聚合迭代器可以与许多迭代器结合,实现更高效的迭代。
这篇文章主要给大家分享PHP回调函数处理数组的操作,具有一定的借鉴价值,感兴趣的朋友可以参考一下,希望大家阅读完这篇文章能有所收获,下面我们一起来学习一下吧。
phpstorm添加图片的方法:首先打开phpstorm软件并连续按两下shift键;接着输入命令“set Background Image”;最后设置好图片的清晰度即可。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008