0

我有一个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();

编辑:

所以多亏了斯蒂芬的建议,我才能想出这个可行的方法

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

2 回答 2

1

改为使用ftp_rawlist

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

ftp_rawlist($connid, "-a");

参数的-a意思all与 unix 命令行上的一样:ls -a.

于 2013-01-01T18:30:39.630 回答
0

我之前遇到过这个问题,但我没有使用ftp_nlist. 我最终做的是使用 PHP 的ZipArchive打开 zip 文件并查找(并排除)__MACOSX目录。我还忽略了其中只有一个目录的 zip 文件(因此您不必解压缩文件,然后有两个目录很深来获取数据 - 这总是让我烦恼)。

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

无论如何,事不宜迟......这是我正在使用的代码。希望对您有所帮助:

//
// 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;
}
于 2013-01-01T18:26:50.693 回答