PHP打包檔案執行個體

來源:互聯網
上載者:User
很多時候我們可能需要將很多小檔案打包提供給使用者下載,那具體如何?呢?本文主要介紹了PHP打包檔案執行個體,直接給出PHP打包檔案的範例程式碼,希望對大家有所協助。

大概需求:

每一個訂單都有多個檔案附件,在下載的時候希望對當前訂單的檔案自動打包成一個壓縮包下載

細節需求:當前訂單號_年月日+時間.zip 例如:

1.產生壓縮檔,壓縮檔名格式:

2.壓縮檔存放在根目錄 /upload/zipfile/年月/自訂的壓縮檔名.zip

3.點擊下載壓縮包,系統開始對壓縮檔打包,打包完成後自動開始下載

4.為了防止暴露壓縮包檔案路徑,需要對下載的壓縮包檔案名稱改名

具體操作模式請見下面的代碼:

檔案路徑:

壓縮包檔案存放路徑:/upload/zipfile/

上傳的附件存放路徑:/upload/file/

1.基本設定檔檔案 config.inc.php放在系統根目錄


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',); //這裡是附件的檔案數組$orderNum = '888'; //訂單號$downFileName = 'tieniu.zip'; //下載的檔案名稱 如果為空白那麼就是系統自訂名稱 如果指定就顯示指定名字$zipUrl = create_zip($arrfiles, $orderNum); //產生的壓縮檔名詞file_down($zipUrl, $downFileName); //提供http下載,並可以進行重新命名下載檔案,建議重新命名,防止路徑猜解/* * 產生壓縮包檔案名稱 * @param [String] $orderNum 訂單號 * @return [String] 返回帶有絕對路徑的訂單號的壓縮檔名 */function get_zipname($orderNum) {  $zipName = SYS_DOWNLOAD . '/' . date('Ym') . '/' . $orderNum . '_' . date("Ymd_Hi") . '.zip';  return $zipName;}/* * 按照特定需求打包壓縮包的目錄結構設定 */function pack_object() {  }/* * 產生壓縮包 * @param [Array] $arrfiles 帶有絕對路徑的檔案數組 * @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 帶有絕對路徑的檔案數組 * @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] 返回產生的檔案目錄結構 */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;  }}/* * 檔案下載處理函數 * @param [String] $file 檔案路徑 * @param [String] $filename 下載時間重新命名的檔案名稱 * @param [String] $data 下載檔案填裝的資料內容 */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)));}//此函數未用到,用來做整個目錄的打包下載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的擴充類,自php5.2版本以後就已經支援這個擴充,如果你在使用的時候出現錯誤,查看下php.ini裡面的extension=php_zip.dll前面的分號有沒有去掉,然後再重啟Apache這樣才能使用這個類庫。


相關推薦:

php 檔案分割與合并(斷點續傳)

php 檔案類型的判斷範例程式碼

簡單談談 php 檔案鎖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.