一、PHP实现打包zip并下载功能


  1. $file_template = FCPATH.'canddata/cand_picture.zip';//在此之前你的项目目录中必须新建一个空的zip包(必须存在)
  2. $downname = $card.'.zip';//你即将打包的zip文件名称
  3. $file_name = FCPATH.'canddata/'.$card.'.zip';//把你打包后zip所存放的目录
  4. $result = copy( $file_template, $file_name );//把原来项目目录存在的zip复制一份新的到另外一个目录并重命名(可以在原来的目录)
  5. $zip = new ZipArchive();//新建一个对象
  6. if ($zip->open($file_name, ZipArchive::CREATE) === TRUE) { //打开你复制过后空的zip包
  7.   $zip->addEmptyDir($card);//在zip压缩包中建一个空文件夹,成功时返回 TRUE, 或者在失败时返回 FALSE
  8.   //下面是我的场景业务处理,可根据自己的场景需要去处理(我的是将所有的图片打包)
  9.   $i = 1;
  10.   foreach ($cand_photo as $key3 => $value3) {
  11.     $file_ext = explode('.',$value3['cand_face']);//获取到图片的后缀名
  12.     $zip->addFromString($card.'/'.$card.'_'.$i.'.'.$file_ext[3] , file_get_contents($value3['cand_face']));//(图片的重命名,获取到图片的二进制流)
  13.     $i++;
  14.   }
  15.   $zip->close();
  16.   $fp=fopen($file_name,"r");
  17.   $file_size=filesize($file_name);//获取文件的字节
  18.   //下载文件需要用到的头
  19.   Header("Content-type: application/octet-stream");
  20.   Header("Accept-Ranges: bytes");
  21.   Header("Accept-Length:".$file_size);
  22.   Header("Content-Disposition: attachment; filename=$downname");
  23.   $buffer=1024; //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器)
  24.   $file_count=0; //读取的总字节数
  25.   //向浏览器返回数据 如果下载完成就停止输出,如果未下载完成就一直在输出。根据文件的字节大小判断是否下载完成
  26.   while(!feof($fp) && $file_count<$file_size){
  27. $file_con=fread($fp,$buffer);
  28. $file_count+=$buffer;
  29. echo $file_con;
  30. }
  31.   fclose($fp);
  32.   //下载完成后删除压缩包,临时文件夹
  33.   if($file_count >= $file_size) {
  34.     unlink($file_name);
  35.   }
  36. }


二、PHP实现大文件下载

此方法为大文件下载的实现,即使几个G也可实现本地的下载。可以测试一下,或者等你从中改进...

  1. function downloadFile($filename){
  2. //获取文件的扩展名
  3. $allowDownExt=array ( 'rar','zip','png','txt','mp4','html');
  4. //获取文件信息
  5. $fileext=pathinfo($filename);
  6. //检测文件类型是否允许下载
  7. if(!in_array($fileext['extension'],$allowDownExt)) {
  8. return false;
  9. }
  10. //设置脚本的最大执行时间,设置为0则无时间限制
  11. set_time_limit(0);
  12. ini_set('max_execution_time', '0');
  13. //通过header()发送头信息
  14. //因为不知道文件是什么类型的,告诉浏览器输出的是字节流
  15. header('content-type:application/octet-stream');
  16. //告诉浏览器返回的文件大小类型是字节
  17. header('Accept-Ranges:bytes');
  18. //获得文件大小
  19. //$filesize=filesize($filename);//(此方法无法获取到远程文件大小)
  20. $header_array = get_headers($filename, true);
  21. $filesize = $header_array['Content-Length'];
  22. //告诉浏览器返回的文件大小
  23. header('Accept-Length:'.$filesize);
  24. //告诉浏览器文件作为附件处理并且设定最终下载完成的文件名称
  25. header('content-disposition:attachment;filename='.basename($filename));
  26. //针对大文件,规定每次读取文件的字节数为4096字节,直接输出数据
  27. $read_buffer=4096;
  28. $handle=fopen($filename, 'rb');
  29. //总的缓冲的字节数
  30. $sum_buffer=0;
  31. //只要没到文件尾,就一直读取
  32. while(!feof($handle) && $sum_buffer<$filesize) {
  33. echo fread($handle,$read_buffer);
  34. $sum_buffer+=$read_buffer;
  35. }
  36. //关闭句柄
  37. fclose($handle);
  38. exit;
  39.  
  40. }

三,PHP扩展类ZipArchive实现压缩Zip文件和文件打包下载

这是一个类,封装了方法,也可以尝试一下!

  1. <?php
  2. /**
  3. * 关于文件压缩和下载的类
  4. * @author tycell
  5. * @version 1.0
  6. */
  7. class zip_down{
  8.  
  9. protected $file_path;
  10. /**
  11. * 构造函数
  12. * @param [string] $path [传入文件目录]
  13. */
  14. public function __construct($path){
  15. $this->file_path=$path; //要打包的根目录
  16. }
  17. /**
  18. * 入口调用函数
  19. * @return [type] [以二进制流的形式返回给浏览器下载到本地]
  20. */
  21. public function index(){
  22. $zip=new ZipArchive();
  23. $end_dir=$this->file_path.date('Ymd',time()).'.zip';//定义打包后的包名
  24. $dir=$this->file_path;
  25. if(!is_dir($dir)){
  26. mkdir($dir);
  27. }
  28. if($zip->open($end_dir, ZipArchive::OVERWRITE) === TRUE){ ///ZipArchive::OVERWRITE 如果文件存在则覆盖
  29. $this->addFileToZip($dir, $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
  30. $zip->close();
  31. }
  32. if(!file_exists($end_dir)){
  33. exit("无法找到文件");
  34. }
  35. header("Cache-Control: public");
  36. header("Content-Description: File Transfer");
  37. header("Content-Type: application/zip"); //zip格式的
  38. header('Content-disposition: attachment; filename='.basename($end_dir)); //文件名
  39. header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
  40. header('Content-Length:'.filesize($end_dir)); //告诉浏览器,文件大小
  41. @readfile($end_dir);
  42. $this->delDirAndFile($dir,true);//删除目录和文件
  43. unlink($end_dir);////删除压缩包
  44. }
  45. /**
  46. * 文件压缩函数 需要开启php zip扩展
  47. * @param [string] $path [路径]
  48. * @param [object] $zip [扩展ZipArchive类对象]
  49. */
  50. protected function addFileToZip($path, $zip){
  51. $handler = opendir($path);
  52. while (($filename=readdir($handler)) !== false) {
  53. if ($filename!= "." && $filename!=".."){
  54. if(!is_dir($filename)){
  55. $zip->addFile($path."/".$filename,$filename); //第二个参数避免将目录打包,可以不加
  56. }
  57. }
  58. }
  59. @closedir($path);
  60. }
  61. /**
  62. * 删除文件函数
  63. * @param [string] $dir [文件目录]
  64. * @param boolean $delDir [是否删除目录]
  65. * @return [type] [description]
  66. */
  67. protected function delDirAndFile($path,$delDir=true){
  68. $handle=opendir($path);
  69. if($handle){
  70. while(false!==($item = readdir($handle))){
  71. if($item!="."&&$item!=".."){
  72. if(is_dir($path.'/'.$item)){
  73. $this->delDirAndFile($path.'/'.$item, $delDir);
  74. }else{
  75. unlink($path.'/'.$item);
  76. }
  77. }
  78. }
  79. @closedir($handle);
  80. if($delDir){return rmdir($path);}
  81. }else{
  82. if(file_exists($path)){
  83. return unlink($path);
  84. }else{
  85. return FALSE;
  86. }
  87. }
  88. }
  89.  
  90. }

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!