PHP生成壓縮文件實(shí)例
大概需求:
每一個(gè)訂單都有多個(gè)文件附件,在下載的時(shí)候希望對(duì)當(dāng)前訂單的文件自動(dòng)打包成一個(gè)壓縮包下載
細(xì)節(jié)需求:當(dāng)前訂單號(hào)_年月日+時(shí)間.zip 例如:
1.生成壓縮文件,壓縮文件名格式:
2.壓縮文件存放在根目錄 /upload/zipfile/年月/自定義的壓縮文件名.zip
3.點(diǎn)擊下載壓縮包,系統(tǒng)開始對(duì)壓縮文件打包,打包完成后自動(dòng)開始下載
4.為了防止暴露壓縮包文件路徑,需要對(duì)下載的壓縮包文件名改名
具體操作模式請(qǐng)見下面的代碼:
文件路徑:
壓縮包文件存放路徑:/upload/zipfile/
上傳的附件存放路徑:/upload/file/
1.基本配置文件文件 config.inc.php放在系統(tǒng)根目錄
define('SYS_ROOT', str_replace("\\", '/', dirname(__FILE__))); define('SYS_UPLOAD', SYS_ROOT.'/upload/file'); define('SYS_DOWNLOAD', SYS_ROOT.'/upload/zipfile'); define('SYS_WIN', strpos(strtoupper(PHP_OS), 'WIN') !== false ? true: false); define('SYS_CHMOD', ('0777' && !SYS_WIN) ? '0777' : 0);
2.壓縮包程序代碼文件 getzip.php
header("Content-type: text/html; charset=utf-8"); require_once '../config.inc.php'; //載入配置路徑配置文件 $arrfiles = array(SYS_UPLOAD . '/1.jpg', SYS_UPLOAD . '/x.jpg',); //這里是附件的文件數(shù)組 $orderNum = '888'; //訂單號(hào) $downFileName = 'tieniu.zip'; //下載的文件名 如果為空那么就是系統(tǒng)自定義名稱 如果指定就顯示指定名字 $zipUrl = create_zip($arrfiles, $orderNum); //生成的壓縮文件名詞 file_down($zipUrl, $downFileName); //提供http下載,并可以進(jìn)行重命名下載文件,建議重命名,防止路徑猜解 /* * 生成壓縮包文件名 * @param [String] $orderNum 訂單號(hào) * @return [String] 返回帶有絕對(duì)路徑的訂單號(hào)的壓縮文件名 */ function get_zipname($orderNum) { $zipName = SYS_DOWNLOAD . '/' . date('Ym') . '/' . $orderNum . '_' . date("Ymd_Hi") . '.zip'; return $zipName; } /* * 按照特定需求打包壓縮包的目錄結(jié)構(gòu)設(shè)置 */ function pack_object() { } /* * 生成壓縮包 * @param [Array] $arrfiles 帶有絕對(duì)路徑的文件數(shù)組 * @param [String] $orderNum 訂單號(hào) * @return [String] 返回帶有絕對(duì)路徑的訂單號(hào)的壓縮文件名 如如果失敗返回 FALSE */ function create_zip($arrfiles, $orderNum) { $zipName = get_zipname($orderNum); //獲得文件名 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; } /* * 處理文件目錄 * @param [Array] $arrfiles 帶有絕對(duì)路徑的文件數(shù)組 * @param [String] $dirpath 文件路徑 * @return [String] 返回處理的文件路徑,方便生成文件目錄 */ function dir_path($dirpath) { $dirpath = str_replace('\\', '/', $dirpath); if (substr($dirpath, -1) != '/') $dirpath = $dirpath . '/'; return $dirpath; } /* * 生成文件目錄 * @param [String] $path 文件路徑 * @return [String] 返回生成的文件目錄結(jié)構(gòu) */ function dir_create($path) { if (is_dir($path)) return true; $dir = str_replace(SYS_DOWNLOAD . '/', '', $path); $dir = dir_path($dir); $temp = explode('/', $dir); $cur_dir = SYS_DOWNLOAD . '/'; $max = count($temp) - 1; for ($i = 0; $i < $max; $i++) { $cur_dir .= $temp[$i] . '/'; if (is_dir($cur_dir)) continue; @mkdir($cur_dir); if (SYS_CHMOD) @chmod($cur_dir, SYS_CHMOD); if (!is_file($cur_dir . '/index.html') && !is_file($cur_dir . '/index.php')) file_copy(SYS_ROOT . '/upload/index.html', $cur_dir . '/index.html'); } return is_dir($path); } /* * 文件COPY * @param [String] $from copy源文件 * @param [String] $to copy文件目的地 * @return [Bool] 成功 ture 失敗 false */ function file_copy($from, $to) { dir_create(dirname($to)); if (is_file($to) && SYS_CHMOD) @chmod($to, SYS_CHMOD); if (@copy($from, $to)) { if (SYS_CHMOD) @chmod($to, SYS_CHMOD); return true; } else { return false; } } /* * 文件下載處理函數(shù) * @param [String] $file 文件路徑 * @param [String] $filename 下載時(shí)間重新命名的文件名 * @param [String] $data 下載文件填裝的數(shù)據(jù)內(nèi)容 */ function file_down($file, $filename = '', $data = '') { if (!$data && !is_file($file)) exit; $filename = $filename ? $filename : basename($file); $filetype = file_ext($filename); $filesize = $data ? strlen($data) : filesize($file); ob_end_clean(); @set_time_limit(0); if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) { header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); } else { header('Pragma: no-cache'); } header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Content-Encoding: none'); header('Content-Length: ' . $filesize); header('Content-Disposition: attachment; filename=' . $filename); header('Content-Type: ' . $filetype); if ($data) { echo $data; } else { readfile($file); } exit; } function file_ext($filename) { return strtolower(trim(substr(strrchr($filename, '.'), 1))); } //此函數(shù)未用到,用來做整個(gè)目錄的打包下載 function listdir($start_dir = '.') { $files = array(); if (is_dir($start_dir)) { $fh = opendir($start_dir); while (($file = readdir($fh)) !== false) { if (strcmp($file, '.') == 0 || strcmp($file, '..') == 0) continue; $filepath = $start_dir . '/' . $file; if (is_dir($filepath)) $files = array_merge($files, listdir($filepath)); else array_push($files, $filepath); } closedir($fh); } else { $files = false; } return $files; }
3.PHP程序生成壓縮文件需要用到壓縮類:ZipArchive
這個(gè)是php的擴(kuò)展類,自php5.2版本以后就已經(jīng)支持這個(gè)擴(kuò)展,如果你在使用的時(shí)候出現(xiàn)錯(cuò)誤,查看下php.ini里面的extension=php_zip.dll前面的分號(hào)有沒有去掉,然后再重啟Apache這樣才能使用這個(gè)類庫。
- php gd2 上傳圖片/文字水印/圖片水印/等比例縮略圖/實(shí)現(xiàn)代碼
- PHP 圖片水印類代碼
- php文字水印和php圖片水印實(shí)現(xiàn)代碼(二種加水印方法)
- PHP實(shí)現(xiàn)圖片壓縮的兩則實(shí)例
- php實(shí)現(xiàn)壓縮多個(gè)CSS與JS文件的方法
- PHP圖片處理之使用imagecopy函數(shù)添加圖片水印實(shí)例
- php_imagick實(shí)現(xiàn)圖片剪切、旋轉(zhuǎn)、銳化、減色或增加特效的方法
- php文件壓縮之PHPZip類用法實(shí)例
- php使用gzip壓縮傳輸js和css文件的方法
- php圖片水印添加、壓縮、剪切的封裝類實(shí)現(xiàn)
相關(guān)文章
ThinkPHP5查詢數(shù)據(jù)及處理結(jié)果的方法小結(jié)
這篇文章主要介紹了ThinkPHP5查詢數(shù)據(jù)及處理結(jié)果的方法,結(jié)合實(shí)例總結(jié)分析了thinkPHP5常見查詢語句及查詢數(shù)據(jù)庫的三種方式,需要的朋友可以參考下2017-11-11thinkphp5.1驗(yàn)證碼及驗(yàn)證碼驗(yàn)證功能的實(shí)現(xiàn)詳解
這篇文章主要介紹了thinkphp5.1驗(yàn)證碼及驗(yàn)證碼驗(yàn)證功能的實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01PHP兩個(gè)n位的二進(jìn)制整數(shù)相加問題的解決
這篇文章主要為大家詳細(xì)介紹了PHP兩個(gè)n位的二進(jìn)制整數(shù)相加問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08TP5(thinkPHP5)框架使用ajax實(shí)現(xiàn)與后臺(tái)數(shù)據(jù)交互的方法小結(jié)
這篇文章主要介紹了TP5(thinkPHP5)框架使用ajax實(shí)現(xiàn)與后臺(tái)數(shù)據(jù)交互的方法,結(jié)合實(shí)例形式總結(jié)分析了thinkPHP5使用ajax與后臺(tái)數(shù)據(jù)交互的兩種實(shí)現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下2020-02-02PHP實(shí)現(xiàn)把MySQL數(shù)據(jù)庫導(dǎo)出為.sql文件實(shí)例(仿PHPMyadmin導(dǎo)出功能)
這篇文章主要介紹了PHP實(shí)現(xiàn)把MySQL數(shù)據(jù)庫導(dǎo)出為.sql文件實(shí)例(仿PHPMyadmin導(dǎo)出功能),需要的朋友可以參考下2014-05-05