0

php画像の zip ファイルをフォルダーにアップロードするスクリプトがあります。このスクリプトは、zip ファイル内のファイルのみを再帰的に検索し、すべてのファイルをサーバー上の 1 つのディレクトリに配置します。

問題は、特定のファイルが二重にアップロードされることです。これはスクリプトのせいではなく、アップル コンピューターのばかげたことと劣等感のせいで、Mac が画像の zip ファイルを作成すると、画像のフォルダーが作成され、まったく同じ画像のみが含まれる別のフォルダーが作成されます。 _" をファイル名の前に付けます。Apple コンピューターがすぐに姿を消すという幸運に恵まれないことを見て、私は自分の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");

引数-aall、UNIX コマンドラインの場合と同じ意味です: ls -a.

于 2013-01-01T18:30:39.630 に答える
0

以前にこの問題に遭遇しましたが、を使用していませんでしftp_nlistた。私がやったことは、PHPのZipArchiveを使用してzipファイルを開き、ディレクトリを探す(そして除外する)こと__MACOSXでした。また、ディレクトリが1つしかないzipファイルも無視しました(ファイルを解凍してから、データにアクセスするために2つのディレクトリを深くする必要はありません。これは常に煩わしいことです)。

私の解決策は、余分な処理が必要なため、あなたにとって最善ではないかもしれませんが、私にとってはうまくいきました:)

とにかく、これ以上苦労することなく...これが私が使用しているコードです。うまくいけば、それはあなたの助けになるでしょう:

//
// 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 に答える