php递归拉链?

时间:2010-12-22 02:22:44

标签: php zip

目前,当涉及到多个小文件时,FTP在我们的服务器上非常慢。

我想创建一个可以在浏览器中运行的文件来创建一个zip文件。

基本上这个文件将位于/ htdocs

它创建的zip文件必须获取/ htdocss(和子文件夹ect)中的所有文件并模仿结构。

有人能指出我正确的方向吗?

我正在尝试使用以下代码。

唯一的问题是, 我收到一些空白文件夹

说文件是:

C:/xampp/htdocs/booking/zip.php

我明白了 / C
/ C / XAMPP
/ C / XAMPP / htdocs中
/ C / XAMPP / htdocs中/预订
/C/xampp/htdocs/booking/image.png
/C/xampp/htdocs/booking/index.php

我不想要/C/xampp/htdocs/booking

我只想要包含zip文件 image.png 的index.php

我该如何解决这个问题?

<?php

function Zip($source, $destination) {
  if(extension_loaded('zip') === true) {
    if(file_exists($source) === true) {
      $zip = new ZipArchive();

      if($zip->open($destination, ZIPARCHIVE::CREATE) === true) {
        $source = realpath($source);

        if(is_dir($source) === true) {
          $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);

          foreach($files as $file) {
            $file = realpath($file);

            if(is_dir($file) === true) {
              $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));
            } else if(is_file($file) === true) {
              $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));
            }
          }
        } else if(is_file($source) === true) {
          $zip->addFromString(basename($source), file_get_contents($source));
        }
      }

      return $zip->close();
    }
  }

  return false;
}

Zip(dirname(__FILE__), 'testzip.zip');
?>

1 个答案:

答案 0 :(得分:2)

有两种选择。您可以使用内置ZipArchive的PHP并手动迭代目录内容(readdir或DirectoryIterator)。

或者你可以做懒惰的事情:

header("Content-Type: archive/zip");   // mime 2.0
header("Content-Disposition: attachment; filename=dir.zip");
passthru("zip -q -r - .");

取决于已安装的zip工具。如果你在终端上试试,它会抱怨,但应该通过passthru管。