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");
}

それ自体がDirectoryIteratorであるFilesystemIteratorであるRecursiveDirectoryIteratorを呼び出しています。の中には、SplFileInfoがあります。 foreach$value

私たちの最初のショットはこれになります:

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

getRealPathは同じことを返しますがrealpathgetBasenameはファイル名自体だけを返しますbasename

ただし、これは期待どおりに機能しません。ほら、これは再帰的なディレクトリイテレータであり、これによりサブディレクトリ内のファイルのパスがフラットになります。あなたが自分でそれをクラックすることができないならば、私はしばらくしてこれに対する解決策で戻って編集します。

于 2012-12-15T19:34:11.557 に答える