PHP實現zip壓縮打包下載


先來看PHP實現文件及文件夾的zip壓縮

這里使用PHP擴展的ZipArchive類,在使用之前要將php.ini文件中的zlib.output_compression設置為On

代碼如下:

    public function addFileToZip($path, $current, $zip) {
        // 打開文件夾資源
        $handler = opendir($path);
        // 循環讀取文件夾內容
        while(($filename = readdir($handler)) !== false) {
            // 過濾掉Linux系統下的.和..文件夾
            if ($filename != '.' && $filename != '..') {
                // 文件指針當前位置指向的如果是文件夾,就遞歸壓縮
                if (is_dir($path.'/'.$filename)) {
                    $this->addFileToZip($path.'/'.$filename, $filename, $zip);
                }else {
                    // 為了在壓縮文件的同時也將文件夾壓縮,可以設置第二個參數為文件夾/文件的形式,文件夾不存在自動創建壓縮文件夾
                    $zip->addFile($path.'/'.$filename, $current.'/'.$filename);
                }
            }
        }
        @closedir($handler);
    }
    $zipName = 'your zip file path';
// 如果壓縮文件不存在,就創建壓縮文件
        if (! is_file($zipName)) {
            $fp = fopen($zipName, 'w');
            fclose($fp);
        }
        $zip = new \ZipArchive();
        // OVERWRITE選項表示每次壓縮時都覆蓋原有內容,但是如果沒有那個壓縮文件的話就會報錯,所以事先要創建好壓縮文件
        // 也可以使用CREATE選項,此選項表示每次壓縮時都是追加,不是覆蓋,如果事先壓縮文件不存在會自動創建
        if ($zip->open($zipName, \ZipArchive::OVERWRITE) === true) {
        $current = 'uplaods/'; // 你要壓縮的文件的主目錄
$compress->addFileToZip($path, $current, $zip); $zip->close(); }else { exit('下載失敗!'); }

在壓縮完之后我們可能還需要下載,而且下載完之后還可以刪除壓縮文件。

代碼如下:

class Download
{
    public static function downloadFile($filePath,$showName) {
        if (is_file($filePath)) {
            //打開文件
            $file = fopen($filePath,"r");
            //返回的文件類型
            Header("Content-type: application/octet-stream");
            //按照字節大小返回
            Header("Accept-Ranges: bytes");
            //返回文件的大小
            Header("Accept-Length: ".filesize($filePath));
            //這里設置客戶端的彈出對話框顯示的文件名
            Header("Content-Disposition: attachment; filename=".$showName);
            //一次性將數據傳輸給客戶端
            //echo fread($file, filesize($filePath));
            //一次只傳輸1024個字節的數據給客戶端
            //向客戶端回送數據
            $buffer=1024;//
            //判斷文件是否讀完
            while (!feof($file)) {
                //將文件讀入內存
                $file_data = fread($file, $buffer);
                //每次向客戶端回送1024個字節的數據
                echo $file_data;
            }
            return true;
        }else {
            return false;
        }
    }
}


// 調用這個方法的部分
// 下載壓縮后的文件
        if (! Download::downloadFile($zipName, $showName)) {
            return "<script>alert('下載失敗!')</script>";
        }else {
            @unlink($zipName);
        }

 

以上的代碼基本可以實現簡單的打包下載功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM