使用 ZipArchive() 在 PHP 中归档目录时如何实现以下文件结构;

Posted

技术标签:

【中文标题】使用 ZipArchive() 在 PHP 中归档目录时如何实现以下文件结构;【英文标题】:How to achieve the following file structure when archiving a directory in PHP using ZipArchive(); 【发布时间】:2014-03-26 23:14:35 【问题描述】:

我正在编写一个 php 脚本,用于归档选定目录及其所有子文件夹。代码运行良好,但是我在存档文件的结构上遇到了一个小问题。

假设脚本位于 var/app/current/example/two/ 并且它想要备份所有内容以及从 var/app/current 开始的子目录>

当我运行脚本时,它会创建一个具有以下结构的存档:

/var/app/current/index.html
/var/app/current/assets/test.css
/var/app/current/example/file.php
/var/app/current/example/two/script.php

现在我想知道如何:

a) 如何删除 /var/app/current/ 文件夹,以便存档的根目录从当前文件夹开始,创建以下结构:

index.html
assets/test.css
example/file.php
example/two/script.php

b) 为什么以及如何去掉文件夹变量前的“/”?

//Create ZIP file
$zip = new ZipArchive();  
$tmpzip = realpath(dirname(__FILE__))."/".substr(md5(TIME_NOW), 0, 10).random_str(54).".zip";

//If ZIP failed
if($zip->open($tmpzip,ZIPARCHIVE::CREATE)!== TRUE)

    $status = "0";

else

    //Fetch all files from directory    
    $basepath = getcwd(); //   var/app/current/example/two
    $basepath = str_replace("/example/two", "", $basepath); //   var/app/current
    $dir = new RecursiveDirectoryIterator($basepath);

    //Loop through each file
    foreach(new RecursiveIteratorIterator($dir) as $files => $file)
    
        if(($file->getBasename() !== ".") && ($file->getBasename() !== ".."))
        
            $zip->addFile(realpath($file), $file);  
        
    

    $zip->close();

【问题讨论】:

【参考方案1】:

您应该尝试:

$zip->addFile(realpath($file), str_replace("/var/app/current/","",$file)); 

【讨论】:

不会是一个解决方案,因为 /var/app/current/ 是一个变量。该脚本应适用于任何目录结构。 嗯,你的问题是How can I remove the /var/app/current/ folders so that the root directory of the archive starts beyond the folder current, creating the following structure...,这确实回答了你的问题。如果您需要不同的答案,那么您应该提供更多详细信息。您可以在我提供的str_replace 中使用变量而不是"/var/app/current/" 吗?例如:$zip->addFile(str_replace($root,"",realpath($file)), $file); $root="/var/app/current/";? 整个方法都行不通。您不能在 addFile 函数中使用 str_replace。感谢您通过 (: 是的,我只是在错误的地方使用了它。 addFile() 的第二个参数实际上是您希望出现在 zip 存档中的名称(localname - 如果提供,这是 ZIP 存档中将覆盖文件名的本地名称)。我只是不记得我的头顶是第一个参数还是第二个参数。阅读更多us3.php.net/manual/en/ziparchive.addfile.php 干杯!我应该看起来更好。非常感谢,祝您有美好的一天!【参考方案2】:

我以前从未使用过 ZipArchive 类,但对于大多数归档应用程序,如果您更改目录并使用相对路径,它就可以工作。 所以你可以尝试使用chdir 到你要压缩的文件夹。

【讨论】:

不知道它是如何工作的。 'chdir("../../../"); $test = getcwd(); $dir = new RecursiveDirectoryIterator($test);' $test 输出 /var/app/current/mybb 在您要压缩的目录中,您不应调用 getwd,只需将 $ test 设置为 '.' - 实际目录

以上是关于使用 ZipArchive() 在 PHP 中归档目录时如何实现以下文件结构;的主要内容,如果未能解决你的问题,请参考以下文章

PHP 核心 ZipArchive 与 ZipStream-PHP

php使用ZipArchive压缩文件的心得

如何在 php 7.4 上安装 ziparchive?

我使用 PHP 的 ZipArchive 创建的 .zip 存档在 Windows 10 上已损坏/无效

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩

PHP:使用 ZipArchive 创建 zip 文件时出现错误 (500)