当前位置:Gxlcms > PHP教程 > PHP生成压缩文件实例_php实例

PHP生成压缩文件实例_php实例

时间:2021-07-01 10:21:17 帮助过:14人阅读

大概需求:

每一个订单都有多个文件附件,在下载的时候希望对当前订单的文件自动打包成一个压缩包下载

细节需求:当前订单号_年月日+时间.zip 例如:

1.生成压缩文件,压缩文件名格式:

2.压缩文件存放在根目录 /upload/zipfile/年月/自定义的压缩文件名.zip

3.点击下载压缩包,系统开始对压缩文件打包,打包完成后自动开始下载

4.为了防止暴露压缩包文件路径,需要对下载的压缩包文件名改名

具体操作模式请见下面的代码:

文件路径:

压缩包文件存放路径:/upload/zipfile/

上传的附件存放路径:/upload/file/

1.基本配置文件文件 config.inc.php放在系统根目录

  1. define('SYS_ROOT', str_replace("\\", '/', dirname(__FILE__)));
  2. define('SYS_UPLOAD', SYS_ROOT.'/upload/file');
  3. define('SYS_DOWNLOAD', SYS_ROOT.'/upload/zipfile');
  4. define('SYS_WIN', strpos(strtoupper(PHP_OS), 'WIN') !== false ? true: false);
  5. define('SYS_CHMOD', ('0777' && !SYS_WIN) ? '0777' : 0);

2.压缩包程序代码文件 getzip.php

  1. header("Content-type: text/html; charset=utf-8");
  2. require_once '../config.inc.php'; //载入配置路径配置文件
  3. $arrfiles = array(SYS_UPLOAD . '/1.jpg',
  4. SYS_UPLOAD . '/x.jpg',); //这里是附件的文件数组
  5. $orderNum = '888'; //订单号
  6. $downFileName = 'tieniu.zip'; //下载的文件名 如果为空那么就是系统自定义名称 如果指定就显示指定名字
  7. $zipUrl = create_zip($arrfiles, $orderNum); //生成的压缩文件名词
  8. file_down($zipUrl, $downFileName); //提供http下载,并可以进行重命名下载文件,建议重命名,防止路径猜解
  9. /*
  10. * 生成压缩包文件名
  11. * @param [String] $orderNum 订单号
  12. * @return [String] 返回带有绝对路径的订单号的压缩文件名
  13. */
  14. function get_zipname($orderNum) {
  15. $zipName = SYS_DOWNLOAD . '/' . date('Ym') . '/' . $orderNum . '_' . date("Ymd_Hi") . '.zip';
  16. return $zipName;
  17. }
  18. /*
  19. * 按照特定需求打包压缩包的目录结构设置
  20. */
  21. function pack_object() {
  22. }
  23. /*
  24. * 生成压缩包
  25. * @param [Array] $arrfiles 带有绝对路径的文件数组
  26. * @param [String] $orderNum 订单号
  27. * @return [String] 返回带有绝对路径的订单号的压缩文件名 如如果失败返回 FALSE
  28. */
  29. function create_zip($arrfiles, $orderNum) {
  30. $zipName = get_zipname($orderNum); //获得文件名
  31. dir_create(dirname($zipName)); //建立生成压缩文件的目录
  32. $zip = new ZipArchive();
  33. if ($zip->open($zipName, ZIPARCHIVE::CREATE) !== TRUE) {
  34. return FALSE;
  35. }
  36. foreach ($arrfiles as $path) {
  37. if (is_file($path)) {//判断文件是否存在
  38. $zip->addFile($path, basename($path)); //把文件加入到压缩包中
  39. }
  40. }
  41. $zip->close();
  42. return $zipName;
  43. }
  44. /*
  45. * 处理文件目录
  46. * @param [Array] $arrfiles 带有绝对路径的文件数组
  47. * @param [String] $dirpath 文件路径
  48. * @return [String] 返回处理的文件路径,方便生成文件目录
  49. */
  50. function dir_path($dirpath) {
  51. $dirpath = str_replace('\\', '/', $dirpath);
  52. if (substr($dirpath, -1) != '/')
  53. $dirpath = $dirpath . '/';
  54. return $dirpath;
  55. }
  56. /*
  57. * 生成文件目录
  58. * @param [String] $path 文件路径
  59. * @return [String] 返回生成的文件目录结构
  60. */
  61. function dir_create($path) {
  62. if (is_dir($path))
  63. return true;
  64. $dir = str_replace(SYS_DOWNLOAD . '/', '', $path);
  65. $dir = dir_path($dir);
  66. $temp = explode('/', $dir);
  67. $cur_dir = SYS_DOWNLOAD . '/';
  68. $max = count($temp) - 1;
  69. for ($i = 0; $i < $max; $i++) {
  70. $cur_dir .= $temp[$i] . '/';
  71. if (is_dir($cur_dir))
  72. continue;
  73. @mkdir($cur_dir);
  74. if (SYS_CHMOD)
  75. @chmod($cur_dir, SYS_CHMOD);
  76. if (!is_file($cur_dir . '/index.html') && !is_file($cur_dir . '/index.php'))
  77. file_copy(SYS_ROOT . '/upload/index.html', $cur_dir . '/index.html');
  78. }
  79. return is_dir($path);
  80. }
  81. /*
  82. * 文件COPY
  83. * @param [String] $from copy源文件
  84. * @param [String] $to copy文件目的地
  85. * @return [Bool] 成功 ture 失败 false
  86. */
  87. function file_copy($from, $to) {
  88. dir_create(dirname($to));
  89. if (is_file($to) && SYS_CHMOD)
  90. @chmod($to, SYS_CHMOD);
  91. if (@copy($from, $to)) {
  92. if (SYS_CHMOD)
  93. @chmod($to, SYS_CHMOD);
  94. return true;
  95. } else {
  96. return false;
  97. }
  98. }
  99. /*
  100. * 文件下载处理函数
  101. * @param [String] $file 文件路径
  102. * @param [String] $filename 下载时间重新命名的文件名
  103. * @param [String] $data 下载文件填装的数据内容
  104. */
  105. function file_down($file, $filename = '', $data = '') {
  106. if (!$data && !is_file($file))
  107. exit;
  108. $filename = $filename ? $filename : basename($file);
  109. $filetype = file_ext($filename);
  110. $filesize = $data ? strlen($data) : filesize($file);
  111. ob_end_clean();
  112. @set_time_limit(0);
  113. if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) {
  114. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  115. header('Pragma: public');
  116. } else {
  117. header('Pragma: no-cache');
  118. }
  119. header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
  120. header('Content-Encoding: none');
  121. header('Content-Length: ' . $filesize);
  122. header('Content-Disposition: attachment; filename=' . $filename);
  123. header('Content-Type: ' . $filetype);
  124. if ($data) {
  125. echo $data;
  126. } else {
  127. readfile($file);
  128. }
  129. exit;
  130. }
  131. function file_ext($filename) {
  132. return strtolower(trim(substr(strrchr($filename, '.'), 1)));
  133. }
  134. //此函数未用到,用来做整个目录的打包下载
  135. function listdir($start_dir = '.') {
  136. $files = array();
  137. if (is_dir($start_dir)) {
  138. $fh = opendir($start_dir);
  139. while (($file = readdir($fh)) !== false) {
  140. if (strcmp($file, '.') == 0 || strcmp($file, '..') == 0)
  141. continue;
  142. $filepath = $start_dir . '/' . $file;
  143. if (is_dir($filepath))
  144. $files = array_merge($files, listdir($filepath));
  145. else
  146. array_push($files, $filepath);
  147. }
  148. closedir($fh);
  149. } else {
  150. $files = false;
  151. }
  152. return $files;
  153. }

3.PHP程序生成压缩文件需要用到压缩类:ZipArchive

这个是php的扩展类,自php5.2版本以后就已经支持这个扩展,如果你在使用的时候出现错误,查看下php.ini里面的extension=php_zip.dll前面的分号有没有去掉,然后再重启Apache这样才能使用这个类库。

人气教程排行