在使用 PHP 解压缩之前从 zip 中删除文件

Delete files from zip prior to extracting using PHP

我正在使用 PHP 上传 zip 文件并解压缩。我的验证脚本有问题,刚刚发现罪魁祸首是 windows 创建的 Thumbs.db 文件以改进缓存。如何在解压前删除这些文件?

下面是我的尝试,但是解压的时候其他文件也被删除了。我试过同时使用 deleteIndex()deleteName(),但得到的结果相同。如果我注释掉删除 Thumbs.db 文件的行,我不会遇到意外删除的文件。我的 syslog() 行仅表示正在删除 Thumbs.db 个文件。

<?php
$zip = new ZipArchive();
if ($zip->open($_FILES['upload_file']['tmp_name']) === true) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        //Validate files
        $name=$zip->getNameIndex($i);
        $pieces=explode(DIRECTORY_SEPARATOR,$name);
        if($pieces[count($pieces)-1]=='Thumbs.db'){
            //Delete windows created thumb.db files
            syslog(LOG_INFO,'delete file '.$name.' with index '.$i);
            $zip->deleteIndex($i);  //If commented out, I do not experience the wrong files being deleted
            //Also deletes wrong files: $zip->deleteName($name);
        }
    }
    $zip->extractTo($myPath);
}

?>

在文件操作后关闭存档并在解压前重新打开它:

if ($zip->open($_FILES['upload_file']['tmp_name']) === true) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
       ...    
    }
    $zip->close();
    if ($zip->open($_FILES['upload_file']['tmp_name']) === true) {
        $zip->extractTo($myPath);
    }
}

我相信你的榜样$zip->extractTo($myPath); return false.

在您的特定情况下,使用系统实用程序解压缩存档然后使用 find 删除文件可能更简单。