php递归zip?

发布于 2024-10-08 10:05:13 字数 1644 浏览 4 评论 0原文

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

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

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

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

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

我正在尝试使用下面的代码。

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

说文件是:

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 文件包含 图片.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');
?>

Currently FTP is insanely slow on our server when it comes to multiple small files.

I am wanting to create a file that I can run in my browser that creates a zip file.

Basically this file will sit in /htdocs

The zip file it creates must take all files in /htdocss (and sub folders ect) and mimic the structure.

Can anyone point me in the right direction?

I am attempting to use the below code.

The only issue is that,
I am getting some blank folders

say the file is:

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

I get
/C
/C/xampp
/C/xampp/htdocs
/C/xampp/htdocs/booking
/C/xampp/htdocs/booking/image.png
/C/xampp/htdocs/booking/index.php

I dont want /C/xampp/htdocs/booking

I just want the zip file to contain
image.png
index.php

How can I fix this?

<?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');
?>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沫离伤花 2024-10-15 10:05:13

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

或者您可以做一些偷懒的事情:

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

取决于安装的 zip 工具。如果您在终端上尝试这样做,它会抱怨,但应该通过直通管道工作。

There are two options. You can use PHPs built-in ZipArchive and manually iterate over the directory contents (readdir or DirectoryIterator).

Or you can do the lazy thing:

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

Depends on the installed zip tool. It complains if you try that on the terminal, but should work over the passthru pipe.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文