2015年4月20日 星期一

PHP 產生 ZIP 檔下載

PHP 可使用 ZipArchive class 來產生 zip 壓縮檔,使用 ZipArchive 要先安裝 PECL 的 zip extension。可查看 phpinfo() 輸出的資訊,判斷是否有 zip extension。

以下使用編譯方式安裝 zip extension:
http://pecl.php.net/package/zip 下載 PECL 的 zip extension
wget http://pecl.php.net/get/zip-1.12.5.tgz
解壓縮編譯安裝
tar zxvf zip-1.12.5.tgz
cd zip-1.12.5
/usr/local/php/bin/phpize
#若無法自動找到php-config,則須使用--with-php-config指定php-config的位置
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
修改 php.ini 加入 zip 的 extension
extension = zip.so
之後再依 PHP 執行模式,重新啟動 php 或 apache、nginx 後即可。


ZipArchive 產生壓縮檔案範例(產生一個文字檔,壓縮後下載)
$str = "test...test..."; //檔案內容
$filename = "testfile"; //檔案名稱
$filename_txt = $filename . ".txt";
$filename_zip = $filename . ".zip";
$dir = "/home/backup"; //暫存檔目錄
$pwd_txt = $dir . "/" . $filename_txt;
$pwd_zip = $dir . "/" . $filename_zip;
$res_file = file_put_contents($pwd_txt, $str);
unset($str);
if(FALSE === $res_file){
    die("產生檔案失敗");
}else{
    $zip = new ZipArchive;
    $res_zip = $zip->open($pwd_zip, ZipArchive::CREATE);
    if (TRUE === $res_zip) {
        $zip->addFile($pwd_txt, $filename_txt);
        $zip->close();
        unlink($pwd_txt);
    }else{
        unlink($pwd_txt);
        die("產生壓縮檔失敗");
    }
}

if (file_exists($pwd_zip)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($pwd_zip));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($pwd_zip));
    readfile($pwd_zip);
    exit;
}


參考:
http://php.net/manual/en/zip.installation.php
http://php.net/manual/en/install.pecl.phpize.php
http://php.net/manual/en/function.readfile.php

沒有留言:

張貼留言