PHP生成壓縮文件實例
大概需求:
每一個訂單都有多個文件附件,在下載的時候希望對當(dāng)前訂單的文件自動打包成一個壓縮包下載
細(xì)節(jié)需求:當(dāng)前訂單號_年月日+時間.zip 例如:
1.生成壓縮文件,壓縮文件名格式:
2.壓縮文件存放在根目錄 /upload/zipfile/年月/自定義的壓縮文件名.zip
3.點擊下載壓縮包,系統(tǒng)開始對壓縮文件打包,打包完成后自動開始下載
4.為了防止暴露壓縮包文件路徑,需要對下載的壓縮包文件名改名
具體操作模式請見下面的代碼:
文件路徑:
壓縮包文件存放路徑:/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'; //訂單號
$downFileName = 'tieniu.zip'; //下載的文件名 如果為空那么就是系統(tǒng)自定義名稱 如果指定就顯示指定名字
$zipUrl = create_zip($arrfiles, $orderNum); //生成的壓縮文件名詞
file_down($zipUrl, $downFileName); //提供http下載,并可以進(jìn)行重命名下載文件,建議重命名,防止路徑猜解
/*
* 生成壓縮包文件名
* @param [String] $orderNum 訂單號
* @return [String] 返回帶有絕對路徑的訂單號的壓縮文件名
*/
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 帶有絕對路徑的文件數(shù)組
* @param [String] $orderNum 訂單號
* @return [String] 返回帶有絕對路徑的訂單號的壓縮文件名 如如果失敗返回 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 帶有絕對路徑的文件數(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 下載時間重新命名的文件名
* @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ù)未用到,用來做整個目錄的打包下載
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
這個是php的擴(kuò)展類,自php5.2版本以后就已經(jīng)支持這個擴(kuò)展,如果你在使用的時候出現(xiàn)錯誤,查看下php.ini里面的extension=php_zip.dll前面的分號有沒有去掉,然后再重啟Apache這樣才能使用這個類庫。
相關(guān)文章
thinkphp實現(xiàn)面包屑導(dǎo)航(當(dāng)前位置)例子分享
今天把博客一些細(xì)節(jié)完善了一下,其中修改了一下欄目頁和文章頁中的“當(dāng)前位置”。2014-05-05
Laravel框架DB facade數(shù)據(jù)庫操作詳解
這篇文章主要介紹了Laravel框架DB facade數(shù)據(jù)庫操作,結(jié)合實例形式詳細(xì)分析了laravel數(shù)據(jù)庫基本創(chuàng)建、連接、增刪改查等操作技巧,需要的朋友可以參考下2019-12-12
PHP設(shè)計模式之外觀模式(Facade)入門與應(yīng)用詳解
這篇文章主要介紹了PHP設(shè)計模式之外觀模式(Facade),結(jié)合實例形式詳細(xì)分析了PHP外觀模式的具體原來、用法及相關(guān)操作注意事項,需要的朋友可以參考下2019-12-12
PHP使用CURL_MULTI實現(xiàn)多線程采集的例子
這篇文章主要介紹了PHP使用CURL_MULTI實現(xiàn)多線程采集的例子,CURL_MULTI可以對HTTP進(jìn)行并發(fā)訪問,需要的朋友可以參考下2014-07-07
PHP設(shè)計模式之觀察者模式入門與應(yīng)用案例詳解
這篇文章主要介紹了PHP設(shè)計模式之觀察者模式入門與應(yīng)用,結(jié)合具體案例形式詳細(xì)分析了PHP觀察者模式的相關(guān)概念、原理、使用方法及操作注意事項,需要的朋友可以參考下2019-12-12

