使用 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 创建的 .zip 存档在 Windows 10 上已损坏/无效
PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩