2009-08-11 17 views
5

私は次のコード競合状態

$date = date('U'); 
$user = $_SERVER[REMOTE_ADDR]; 
$filename = md5($date.$user); 

問題にアップロードされたファイルの一意のファイル名を生成していますを作成することなく、アップロードに時間ベースの一意のファイル名を生成すると、私は再びこのファイル名を使用したいということですスクリプトで後で実行されますが、スクリプトの実行に2分の1がかかる場合は、2回目に別のファイル名を取得します。

たとえば、アップロード/サイズ変更/保存画像アップロードスクリプトを使用しています。スクリプトの最初の操作は、リサイズされたイメージをコピーして保存することです。これは、日付関数を使用して一意の名前を割り当てます。スクリプトは保存を処理し、アップロード全体を保存し、名前を割り当てます。スクリプトの最後に($thumb$fullが変数です)、私はMySQLデータベースに、私がアップロードを保存したときに使用したファイル名を挿入する必要があります。

問題は時として大きな画像に、それは別のファイル名で作成されたファイルは、実際の下に保存されているものよりも、データベースの中に置かれて秒以上を要する(変更秒または処理中)、です。

この名前付け方法を使用するのは良い考えではありませんか?

答えて

5

は、私の知る限りでは、ファイルに名前を付けるための素晴らしい方法です。

はあなたではなく、アルゴリズムにするたびに頼るので、変数にそのファイル名を保存し、後で再びそれを参照する必要があります。これは、ユーザ$_SESSIONに格納することができ、ページロード間のクッキー、GET変数などに格納することができます。

希望すること

+1

これは「固有の名前の生成方法」ではなく、「名前を2回生成するのを防ぐ方法」という実際の問題に対処しているようです。 – Lucky

0

なぜこれがすべての場合には、かなりユニークになります

$filename = md5(rand()); 

を使用しません。 $filenameがすでに存在することがわかったら、もう一度呼び出すことができます。私はfile_exists()をチェックして、多分乱数にタックだろうが

+1

rand()は "かなり"ユニークですが、$ date。$ timeは一意です。なぜ、他のもののために1つを交換してください、そして、これ以外に、実際の質問には対処しません。 – Lucky

2

(AIごとに)セッションにファイル名を保存することをおすすめします。それを他の変数の1つに格納すると、エンドユーザーがそれを介してシステムを攻撃する可能性が高くなります。 rand()で連結されたユーザーのMD5は、一意の値の長いリストを取得するうえで便利です。おそらくrand()を使うと衝突の割合が高くなるでしょう。

私はあなたがファイルをアップロードするために、次のされているプロセスについてはよく分からないですが、ファイルのアップロードを処理するための別の方法は、PHPのハンドラが組み込まれています。ファイルをアップロードし、一時的なスペースからアップロードしたファイルを取り出すための「安全な」方法を使用することができます。 (このインスタンスの一時スペースは、改ざんを防止するために、オープンベースのdirディレクティブの外側に安全に配置できます)。 is_uploaded_file()およびmove_uploaded_file()from:http://php.net/manual/en/features.file-upload.post-method.php例2は、発生している問題を処理する可能性があります。あなたはその場でファイル名を選択している場合

は間違いなくその場所に存在するファイルを確認してください。ユーザーの入力が何らかの形または形式で許可されている場合は、引数を検証してフィルタリングし、安全であることを確認します。また、ストレージフォルダにWebでアクセス可能な場合は、名前と拡張子も必ず入力してください。誰かがコードをアップロードして実行できるようにすることは望ましくありません。それは公式に悪い活動につながります。 uniqid

2

ちょうどPHPは識別子を作成する機能を持っていることを追加します。識別子に文字列を付けることもできます(日付は?)。

ユーザーの入力とサーバーのヘッダーを常に検証してください。

0

時間に依存するIDを使用すると良いアイデアはありません - 同時に2つの画像をアップロードすると、後の方が古い画像を上書きすることができます。 uniqid()のような関数を見てください。しかし、このアップロード/サイズ変更/保存スクリプトが「シングルユーザー」を意図している場合、これは大きな問題ではありません。

問題自体に。私があなたであれば、計算されたファイル名を変数に保存し、その点からの変数を使用します。すでに計算されたコンピューティングは時間の無駄です。また、実際に大きな画像や一度に多くの画像をアップロードする場合、スクリプトには20秒もかかることがあります。あなたは1秒間にあなたが望むものすべてを作れるという事実に依存することはできません。