zoukankan      html  css  js  c++  java
  • 【实用】PHP实现下载与压缩文件的一些方法的封装与整理 / php压缩文件夹并下载到本地

    一、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;
                }
            }
        }
     
    }

    转载:https://www.liaotaoo.cn/183.html

     
     
    --------------------------------------------------------------------------------------------------

    php压缩文件夹并下载到本地

     

    /**
    * @param $path 要压缩的文件夹路径
    * @param $filename 要生成的压缩包名称
    */
    public function create_zip($path,$filename) {
      $zip = new ipArchive();
        if($zip->open($filename.'.zip', ipArchive::CREATE | ipArchive::OVERWRITE)) {
        $this->addFileToZip($path, $zip);//调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
        $zip->close(); //关闭处理的zip文件
      }
    }

    
    
    
    
    

    //递归写入压缩包
    public function addFileToZip($path,$zip) {
      $handler = opendir($path); //打开当前文件夹由$path指定。
      while (($filename = readdir($handler)) !== false) {
        if ($filename != "." && $filename != "..") {  //文件夹文件名字为'.'和‘..’,不要对他们进行操作
          if (is_dir($path . "/" . $filename)) {
            $this->addFileToZip($path . "/" . $filename, $zip);
          } else {
            $zip->addFile($path . "/" . $filename);
          }
        }
      }
      @closedir($path);
    }

    
    
    
    
    

    /**
    * @param $path 要下载的文件路径
    * @param $filename 保存的文件名
    */
    public function downloadTemplate($path,$filename){

    
    

      header("Content-type:text/html;charset=utf-8");
      if(!file_exists($path)){
        echo "下载文件不存在!";exit; //如果提示这个错误,很可能你的路径不对,可以打印$file_sub_path查看
      }

    
    

      $fp=fopen($path,"r");

    
    

      $file_size=filesize($path);

    
    

      //下载文件需要用到的头

    
    

      Header("Content-type: application/octet-stream");

    
    

      Header("Accept-Ranges: bytes");

    
    

      Header("Accept-Length:".$file_size);

    
    

      Header("Content-Disposition: attachment; filename=".$filename);

    
    

      $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); //关闭这个打开的文件

    
    

      unlink($path); //删除服务器压缩文件,释放服务器资源
    }

    
    
    
    
    

    $path = 'qrcode/'.$pid.'/'.date('Y-m-d'); //服务器文件路径
    $filename = 'qrcode/'.$pid.'/'.date('Y-m-d'); //想要生成的压缩包

    
    

    //开始压缩文件并且下载到本地
    $this->create_zip($path,$path); //我这里生成的压缩包放在同一个目录下面 就不搞多一个路径 + 文件名了
    $this->downloadTemplate($filename.'.zip',$pid.date('Y-m-d').'.zip');  // !!!!切记  下载文件不要用ajax  下载文件不要用ajax  下载文件不要用ajax  重要的事情说三遍!

    
    
    
    
    

    效果图:

    
    

    
    
    
    
    
    
    
    

    感谢 整合于https://blog.csdn.net/s_hooligan/article/details/94627095 
    https://blog.csdn.net/hexiaoniao/article/details/89222983

    
    
    
     
  • 相关阅读:
    HDFS文件读写操作(基础基础超基础)
    LeetCode & Q35-Search Insert Position-Easy
    LeetCode & Q27-Remove Element-Easy
    LeetCode & Q26-Remove Duplicates from Sorted Array-Easy
    LeetCode & Q1-Two Sum-Easy
    Full-Stack-Fundation-Udacity------Lesson 1 Working with CRUD
    利用封装、继承对Java代码进行优化
    排序算法——冒泡排序
    排序算法——希尔排序
    排序算法——直接插入排序
  • 原文地址:https://www.cnblogs.com/yehuisir/p/14315945.html
Copyright © 2011-2022 走看看