Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用PHP提取之前从zip中删除文件_Php_Zip - Fatal编程技术网

在使用PHP提取之前从zip中删除文件

在使用PHP提取之前从zip中删除文件,php,zip,Php,Zip,我正在使用PHP上传一个zip文件并将其解压缩。我的验证脚本有问题,刚刚发现问题出在Thumbs.db文件上,windows创建这些文件是为了改进缓存。如何在提取之前删除这些文件 下面是我的尝试,但在提取时,其他文件也被删除。我尝试使用了deleteIndex()和deleteName(),但得到了相同的结果。如果我注释掉删除Thumbs.db文件的行,我不会遇到意外删除的文件。Mysyslog()行仅表示正在删除Thumbs.db文件 <?php $zip = new ZipArchiv

我正在使用PHP上传一个zip文件并将其解压缩。我的验证脚本有问题,刚刚发现问题出在
Thumbs.db
文件上,windows创建这些文件是为了改进缓存。如何在提取之前删除这些文件

下面是我的尝试,但在提取时,其他文件也被删除。我尝试使用了
deleteIndex()
deleteName()
,但得到了相同的结果。如果我注释掉删除Thumbs.db文件的行,我不会遇到意外删除的文件。My
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);
    }
}
if($zip->open($\u文件['upload\u文件]['tmp\u名称]])==true){
对于($i=0;$i<$zip->numFiles;$i++){
...    
}
$zip->close();
如果($zip->open($\u文件['upload\u文件]['tmp\u名称]])==true){
$zip->extractTo($myPath);
}
}
我相信你的例子
$zip->extractTo($myPath)返回
false


在您的特定情况下,使用系统实用程序解包归档文件,然后使用删除文件可能会更简单

谢谢你,亚历克斯。我开始想我可能需要先关上它。我回家后会测试一下。为什么你认为它会更简单?在解包之前,我需要/希望对文件进行迭代,以确保只包含适当的文件。
解压
查找
、和
rm
正是为此目的编写的。我只看到了两种php脚本可能有优势的情况:在windows主机上运行,或者有复杂的逻辑来选择文件。谢谢!需要在提取之前关闭并重新打开。我同意使用操作系统可能比使用PHP更有效,但可能更难维护。