完整實作訂單附件打包下載功能:依訂單號與時間命名 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);
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;
}
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);
}
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;
}
ZipArchive 類別php.ini 啟用 extension=php_zip.dll(Windows)或 extension=zip.so(Linux)