0

这是我用来将文件夹(名称在$id变量中)放入存档的脚本。

$sourcefolder="../uploads/fail/$id/";
$zipfilename="fordownload/$id.zip";
$timeout=5000;
$dirlist = new RecursiveDirectoryIterator($sourcefolder);
$filelist = new RecursiveIteratorIterator($dirlist);
ini_set('max_execution_time', $timeout);
$zip = new ZipArchive();
if ($zip->open("$zipfilename", ZipArchive::CREATE) !== TRUE) {
    die ("Error");
}
foreach ($filelist as $key=>$value)
{
    $zip->addFile(realpath($key), $key) or die ("Error");
}
$zip->close();
redict("$zipfilename",0);

问题是我只想把文件夹$id放在存档中,没有前缀../uploads/fail/,但我不知道怎么做。你能帮我吗?

4

1 回答 1

0

因此,这是您代码的核心:

$dirlist = new RecursiveDirectoryIterator($sourcefolder);
$filelist = new RecursiveIteratorIterator($dirlist);
$zip = new ZipArchive();
foreach ($filelist as $key => $value) {
    $zip->addFile(realpath($key), $key) or die ("Error");
}

您正在调用一个RecursiveDirectoryIterator,它是一个FilesystemIterator,它本身就是一个DirectoryIterator。在你的foreach,里面$value是一个SplFileInfo

我们的第一个镜头是这样的:

foreach ($filelist as $path => $fileinfo) {
    $zip->addFile($fileinfo->getRealPath(), $fileinfo->getBasename()) or die ("Error");
}

getRealPath返回相同的东西realpath,而getBasename只返回文件名本身,就像basename会一样。

但是,这不会按预期工作。看,它是一个递归目录迭代器,这会展平子目录中任何文件的路径。如果你不能自己破解它,我会在一段时间后回来编辑这个解决方案。

于 2012-12-15T19:34:11.557 回答