php递归zip?
目前,当涉及多个小文件时,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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有两种选择。您可以使用 PHP 内置 ZipArchive 并手动迭代目录内容 (readdir或目录迭代器)。
或者您可以做一些偷懒的事情:
取决于安装的
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:
Depends on the installed
zip
tool. It complains if you try that on the terminal, but should work over the passthru pipe.