ZipUtils.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. declare(strict_types=1);
  3. namespace app\utils;
  4. use ZipArchive;
  5. class ZipUtils
  6. {
  7. public function packZip($source, $dest)
  8. {
  9. //判断zip扩展是否加载或者文件目录是否存在
  10. if (!extension_loaded('zip') || !file_exists($source)) {
  11. return false;
  12. }
  13. //创建一个zip打包文件
  14. $zip = new ZipArchive();
  15. if (!$zip->open($dest, ZipArchive::CREATE)) {
  16. return false;
  17. }
  18. $source = str_replace('\\', '/', realpath($source));
  19. if (is_dir($source) === true) {
  20. //创建件一个目录迭代器
  21. $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source));
  22. foreach ($files as $file) {
  23. $file = str_replace('\\', '/', $file);
  24. //忽略当前目录和上级目录
  25. if (in_array(substr($file, strrpos($file, '/') + 1), array('.', '..'))) {
  26. continue;
  27. }
  28. if (is_dir($file) === true) {
  29. //创建一个子目录
  30. $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
  31. } else if (is_file($file) === true) {
  32. //创建一个子文件
  33. $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
  34. } else if (is_file($source) === true) {
  35. //创建文件根目录下的文件
  36. $zip->addFromString(basename($source), file_get_contents($source));
  37. }
  38. }
  39. $zip->close();
  40. }
  41. }
  42. protected function addFileToZip(string $path, ZipArchive $zip)
  43. {
  44. $handler = opendir($path); //打开当前文件夹由$path指定。
  45. while (($filename = readdir($handler)) !== false) {
  46. if ($filename != "." && $filename != "..") { //文件夹文件名字为'.'和‘..’,不要对他们进行操作
  47. if (is_dir($path . "/" . $filename)) {
  48. $this->addFileToZip($path . "/" . $filename, $zip);
  49. } else {
  50. $zip->addFile($path . "/" . $filename);
  51. }
  52. }
  53. }
  54. @closedir($handler);
  55. }
  56. /**
  57. * 删除临时路径
  58. * @param $path
  59. */
  60. public function deleteDir($path)
  61. {
  62. if (is_dir($path)) {
  63. //
  64. $dirs = scandir($path);
  65. foreach ($dirs as $dir) {
  66. if ($dir != '.' | $dir != '..') {
  67. $sonDir = $path . '/' . $dir;
  68. if (is_dir($sonDir)) {
  69. $this->deleteDir($sonDir);
  70. @rmdir($sonDir);
  71. } else {
  72. @unlink($sonDir);
  73. }
  74. }
  75. }
  76. @rmdir($path);
  77. }
  78. }
  79. /**
  80. * 文件下载
  81. * @param $file
  82. */
  83. public function downLoad($file)
  84. {
  85. if (file_exists($file)) {
  86. $openFile = fopen($file, 'r');
  87. //返回文件类型
  88. Header('Content-type: application/octet-iostream');
  89. //返回文件的字节大小
  90. Header('Accept-Range: bytes');
  91. //返回文件大小
  92. Header('Accept-Length: ' . $file);
  93. //这里对客户端弹出的对话框,对应的文件名
  94. Header('Content-disposition: filename=' . substr($file, strrpos($file, '/') + 1));
  95. $buffer = 1024;
  96. while (!feof($openFile)) {
  97. $file_data = fread($openFile, $buffer);
  98. echo $file_data;
  99. }
  100. fclose($file);
  101. @unlink($file);
  102. } else {
  103. echo '下载文件不存在';
  104. }
  105. }
  106. }