PHP不显示系统文件/ MAC文件

时间:2013-01-01 17:12:46

标签: php file ftp

我有一个php脚本,可以将图像的zip文件上传到文件夹。此脚本以递归方式仅搜索zip文件中的文件,并将所有文件放在服务器上的单个目录中。

问题是某些文件被双重上传。这不是剧本的错,而是由于苹果计算机的荒谬和低劣,当一个mac创建一个图像的zip文件时,它会创建一个图像文件夹,然后另一个文件夹与完全相同的图像只放置“。 _“在文件名前面。因此,看到我们不会很快被苹果计算机的消失所困扰,我试图在我的php脚本中包含一个简单的函数来搜索这些劣质的mac恶意并从目录中删除它们。但是,当我使用php时,"ftp_nlist"甚至没有提取这些文件。

所以我的问题是:如何让php拉出这些愚蠢的东西,以便删除它们?

$contents = ftp_nlist($conn_id, '.');

foreach($contents as $key => $value){
echo $key." => ".$value."<BR>";

if(substr($value, 1, 1) == ".") {
    if(ftp_delete($conn_id, $value)) {
        echo "Deleting $value<BR>";
    }
}
echo "<BR>";
}
exit();

编辑:

感谢Stephane的建议,我能够提出这个有效的方法

if($zip->open($_FILES['theFile']['tmp_name']) === TRUE){
for($i = 0; $i < $zip->numFiles; $i++) {
    $filename = $zip->getNameIndex($i);
    $fileinfo = pathinfo($filename);
    copy("zip://".$_FILES['theFile']['tmp_name']."#".$filename, $ezPresenter['currentFolder'].'/'.$fileinfo['basename']);
}               
$zip->close();
}else{
exit("Could not upload/extract file");
}

$contents = ftp_rawlist($conn_id, '-a');

foreach($contents as $key => $value){
$value = explode(" ", $value);
$value = $value[count($value)-1];

echo $key." => ".$value."<BR>";

if(strpos($value, ".") === false) {
    if(ftp_delete($conn_id, $value)) {
        echo "Deleting $value<BR>";
    }
}

if(substr($value, 0, 2) == "._") {
    if(ftp_delete($conn_id, $value)) {
        echo "Deleting $value<BR>";
    }
}elseif(substr($value, 0, 1) == "." && $value != "." && $value != "..") {
    if(ftp_delete($conn_id, $value)) {
        echo "Deleting $value<BR>";
    }
}
}

2 个答案:

答案 0 :(得分:1)

请改用ftp_rawlist

  

ftp_rawlist - 返回给定目录中的详细文件列表

ftp_rawlist($connid, "-a");

参数-a表示all与unix命令行相同:ls -a

答案 1 :(得分:0)

之前我遇到过这个问题,但我没有使用ftp_nlist。我最终做的是使用PHP的ZipArchive打开zip文件并查找(并排除)__MACOSX目录。我也忽略了只有一个目录在里面的zip文件(所以你不解压缩文件,然后有两个目录深入到数据 - 这总是让我烦恼)。

我的解决方案可能不是最好的,因为它需要一些额外的处理,但它对我有用:)

无论如何,没有进一步的ado ...这里是我正在使用的代码。希望它对你有所帮助:

//
// unzip the file
$zip = new ZipArchive;
if ($zip->open($fname) === TRUE) {
    //extract zip
    $zip->extractTo($dir);
    $zip->close();
    //detect single dir
    $basedir = function($x) use (&$basedir) {
        $files = glob($x.'*', GLOB_MARK);
        //ignore stupid mac directory
        $k = array_search($x.'__MACOSX/',$files);
        if($k!==FALSE) {
            unset($files[$k]);
            $files = array_values($files);
        }
        if(sizeof($files)==1 && is_dir($files[0]))
            return $basedir($files[0]);
        return $x;
    };
    //get root directory that has files in it
    $dir = substr($basedir($dir.'/'),0,-1);
    //
    // here I re-zipped the data from the base directory
    // and uploaded this file
    //
} else {
    //delete the file
    unlink($fname);
    //
    // some other error handling
    //
    return;
}