<tt dropzone='c2i9mg'><del lang='58tu5y'></del></tt>

    • <caption draggable='x47db8n'></caption>

      文章熱詞:PHP,下載

      日期:2019-04-24 09:49 by admin 1449 0 收藏
      我要分享

      摘要:PHP實現打包zip并下載功能,PHP實現大文件下載,PHP擴展類ZipArchive實現壓縮Zip文件和文件打包下載

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

      上一篇:php+redis實現注冊、删除、編輯等功能

      下一篇:見縫插針CeBall


      評論

      -->