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

时间:2015-11-25 16:52:20

标签: php zip

我正在使用PHP上传zip文件并将其解压缩。我的验证脚本出现问题,刚刚发现罪魁祸首是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);
}

?>

1 个答案:

答案 0 :(得分:1)

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

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);返回false

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