这是我用来将文件夹(名称在$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/
,但我不知道如何。你能帮忙吗?
答案 0 :(得分: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
一样。
但是,这不会按预期工作。看,它是一个递归目录迭代器,这会使子目录中任何文件的路径变得扁平。如果你不能自己破解它,我会在一段时间后回来编辑一个解决方案。