0

重複したファイル名を処理しようとしています。ユーザーが「file」というファイル名をアップロードし、別のユーザーが「file」というファイルをアップロードした場合、新しいファイルに 1 を追加できるようにして、「1file」と呼ばれるようにします。私はこれを行うことができますが、私の問題は、誰かが「ファイル」を3回目にアップロードすると、「1ファイル」が上書きされ、1を増やす必要があることです。私はyiiフレームワークを使用しています

これが私のコントローラーの私の機能です:

function actionIndex(){
  //$dir = Yii::getPathOfAlias('application.images');
  //$dir is a variable that will hold the files uploaded
  $dir = Yii::app()->controller->module->cssFolder;
  //uploaded is a flag to see if we need to display a success/error message
  $uploaded = false;
  $model=new CssUpload();
  if(isset($_POST['CssUpload'])){
      $model->attributes=$_POST['CssUpload'];
      //see if file is correct format and allows us to see and save the file
      $file=CUploadedFile::getInstance($model,'file');
      if($model->validate()){
         $i = 0;
         //trying to add a int to the front/end of a duplicate file
         //able to handle the duplicate one time then gets stuck in an infinete loop
         //(it actually breaks on the first duplictae but it uploads)
        do{
            if(file_exists($dir.'/'.$file)){
                    //increase $i by 1 every time it loops through
                   $i++;
                   //for test purposes only
                   echo $i;
                  //upload the file
                  $uploaded = $file->saveAs($dir.'/'.$i.$file->getName());
                   //stops the infinute loop
                   break;
           }

       }while(file_exists($dir.'/'.$file));
         //upload the original file with no new extensions
         $uploaded = $file->saveAs($dir.'/'.$file->getName());

    }
  }

  $this->render('index', array(
     'model' => $model,
     'uploaded' => $uploaded,
     'dir' => $dir,
  ));

}

4

2 に答える 2

1

さて、私はあなたが2つのオプションを持っていると思います:

  • ファイル名の最後に次のようなものを追加microtime()します。そうすれば、同じファイル名を2回持つことは事実上不可能です。

  • ファイルを整理する必要があり、上記のアプローチを使用たくない場合は、最後に挿入された番号をデータベースに保存してから取得し、インクリメントして再度保存する必要があります。

私もYIIフレームワークを使用していますが、ここで役立つYii固有のことは何も思い出せません。

于 2012-11-14T20:48:20.033 に答える
0

パターンに一致する可能性のあるすべてのファイルをスキャンする必要があります。

ワイルドカード検索を使用してファイルを検索する方法については、こちらをご覧ください: PHP file_exists and wildcard

そこから、2 つのことを行います。

  1. 各ファイルを処理し、数字を読み取り、独自の数字を選択します。
  2. 'file-_-1' のようなファイル名で発生する可能性が低いパターンを考えてみてください。そして、新しいファイルサフィックスを配列 count() の値にします。この方法ではインデックスを見逃す可能性がありますが、より高速です。
于 2012-11-14T19:31:52.117 に答える