首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 產生壓縮檔下載實作:ZipArchive 打包、目錄管理、重命名下載

     編輯:PHP 綜合知識

完整實作訂單附件打包下載功能:依訂單號與時間命名 ZIP、自動建立年月目錄、ZipArchive 打包、HTTP 下載支援重命名、路徑保護。

核心需求

  • 檔名格式:訂單號_年月日時分.zip
  • 儲存路徑:/upload/zipfile/年月/
  • 下載時重命名,隱藏實際儲存路徑
  • 打包完成即時串流下載

關鍵類別與函數

設定常數

define('SYS_ROOT', str_replace('\\', '/', dirname(__FILE__)));
define('SYS_UPLOAD', SYS_ROOT.'/upload/file');
define('SYS_DOWNLOAD', SYS_ROOT.'/upload/zipfile');
define('SYS_WIN', stripos(PHP_OS, 'WIN') !== false);
define('SYS_CHMOD', (!SYS_WIN) ? 0777 : 0);

打包主流程

$arrfiles = [SYS_UPLOAD.'/1.jpg', SYS_UPLOAD.'/x.jpg'];
$orderNum = '888';
$downFileName = 'tieniu.zip';

$zipUrl = create_zip($arrfiles, $orderNum);
file_down($zipUrl, $downFileName);

create_zip() 核心實作

function create_zip($arrfiles, $orderNum) {
    $zipName = SYS_DOWNLOAD . '/' . date('Ym') . '/' . $orderNum . '_' . date("Ymd_Hi") . '.zip';
    dir_create(dirname($zipName));

    $zip = new ZipArchive();
    if ($zip->open($zipName, ZipArchive::CREATE) !== TRUE) return FALSE;

    foreach ($arrfiles as $path) {
        if (is_file($path)) {
            $zip->addFile($path, basename($path));
        }
    }
    $zip->close();
    return $zipName;
}

目錄遞迴建立 dir_create()

function dir_create($path) {
    if (is_dir($path)) return true;
    $dir = str_replace(SYS_DOWNLOAD . '/', '', $path);
    $dir = rtrim($dir, '/') . '/';
    $temp = explode('/', $dir);
    $cur_dir = SYS_DOWNLOAD . '/';
    foreach ($temp as $part) {
        $cur_dir .= $part . '/';
        if (!is_dir($cur_dir)) {
            @mkdir($cur_dir);
            if (SYS_CHMOD) @chmod($cur_dir, SYS_CHMOD);
            @copy(SYS_ROOT . '/upload/index.html', $cur_dir . '/index.html'); // 防止目錄列表
        }
    }
    return is_dir($path);
}

HTTP 下載 file_down()

function file_down($file, $filename = '', $data = '') {
    if (!$data && !is_file($file)) exit;
    $filename = $filename ?: basename($file);
    $filesize = $data ? strlen($data) : filesize($file);

    ob_end_clean();
    @set_time_limit(0);
    header('Content-Encoding: none');
    header('Content-Length: ' . $filesize);
    header('Content-Disposition: attachment; filename=' . $filename);
    header('Content-Type: ' . file_ext($filename));

    if ($data) echo $data;
    else readfile($file);
    exit;
}

環境需求

  • PHP 5.2+ 內建 ZipArchive 類別
  • php.ini 啟用 extension=php_zip.dll(Windows)或 extension=zip.so(Linux)
  • 重啟 Apache/PHP-FPM 生效
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved