競合状態を作成せずにアップロードするための時間ベースの一意のファイル名を生成します

StackOverflow https://stackoverflow.com/questions/1261805

  •  12-09-2019
  •  | 
  •  

質問

私は次のコードでアップロードされたファイルの一意のファイル名を生成しています。

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

問題は、私は、スクリプトの後半に再びこのファイル名を使用したいということですが、スクリプトを実行する2番目を取る場合、私は別のファイル名に、私は、この変数を使用しようとする第二の時間を取得するつもりです。

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

問題は時として大きな画像に、それは二以上かかるファイルが実際に下に保存されているものよりも、データベースの中に置かれて別のファイル名で結果(またはプロセスの間を、秒に変更)、である。

のネーミングのこの方法を使用するには、このだけでは良いアイデアですか?

役に立ちましたか?

解決

私はfile_exists()をチェックして、多分乱数にタックだろうが

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

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

助け

希望

他のヒント

uniqid

ただ、PHPは識別子を作成する機能を持っていることを追加します。あなたも(多分日付?)の文字列と識別子の前に付けることができます。

常に、ユーザーの入力を検証し、サーバヘッダ!

私は(AIに従って)セッションでファイル名を保存することをお勧めします。あなたが他の変数の一つで、それを保存する場合は、それを介してシステムを攻撃することができるようにするエンドユーザーのための可能性が高いです。ランドと連結したユーザ()のMD5は、一意の値の長いリストを取得するための良い方法だろう。ただ、おそらく競合の高い割合を持っているでしょうランド()を使用します。

私は、ファイルをアップロードするために、次のされているプロセスについてはよく分からないですが、ファイルのアップロードを処理するための別の方法は、PHPのハンドラが組み込まれています。あなたは、ファイルをアップロードして、一時的な空間からアップロードされたファイルを引くため「安全な」方法を使用することができます。 (この例では、一時的なスペースが安全に改ざんを防止するために、オープンベースのディレクトリディレクティブの外に位置することができます)。 is_uploaded_file()およびmove_uploaded_file()から:ます。http:// PHP例2 の.NET /マニュアル/ EN / features.file-upload.post-method.phpは、あなたが発生している問題に対処することがあります。

あなたがその場でファイル名を選択している場合は間違いなくその場所に既存のファイルを確認してください。ユーザ入力がどのような方法の形状または形態で許可されている場合、検証し、それが安全であることを確認するために引数をフィルタリングします。保存フォルダは、Webアクセス可能である場合も、あなたにも名前と、おそらく拡張子のmungeことを確認してください。あなたは、誰かがコードをアップロードし、それを実行することができるようにすることができるようにしたくありません。それは正式にBAD活動につながるます。

私は、PHPは、このための組み込み関数と呼ばれる関数tempnamを持っていることを発見しました。それも、競合状態を避けることができます。 http://php.net/manual/en/function.tempnam.php。

使用しないのはなぜ

$filename = md5(rand());

このはかなりユニークなすべてのケースになります。そして、あなたが見つけた場合、その$filenameが既にあなただけのそれを再度呼び出すことができますが存在します。

ない時間に依存IDを使用して良いアイデア - あなたは後で1は、以前のバージョンを上書きすることができ、同時に2枚の画像をアップロードした場合。あなたは、このような uniqid()のとしての機能をご覧ください。このアップロードは/サイズを変更する場合は、保存/スクリプトは、「シングルユーザー」であることを意味する、このような大きな問題ではありません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top