2011-12-19 28 views
7

私のウェブサイトに画像のアップロードを伴うディスカッションフォームがあります。今、私はすべての画像の結果を表示することができ、重複するファイル名を避けることができるように、ユーザーが自分の画像を送信するときに一意のファイル名をアップロードしたい。どのようにPHPでこれを行うことができますか?フォーム処理コードが必要な場合は、アップロードします。phpアップロード時の一意のファイル名

多くのありがとうございます。

+1

http://stackoverflow.com/questions/8551763/stest-image-data-in-mysql-and-naming-conventions/8551813#8551813 – Richard

+1

'move_uploaded_file()で永続ファイルの名前を指定する' uniqid() ' –

答えて

10

あなたは一意の名前が必要な場合は、uniqidを使用することができます

/** 
* Generate a unique ID 
* @link http://www.php.net/manual/en/function.uniqid.php 
* @param prefix string[optional] <p> 
* Can be useful, for instance, if you generate identifiers 
* simultaneously on several hosts that might happen to generate the 
* identifier at the same microsecond. 
* </p> 
* <p> 
* With an empty prefix, the returned string will 
* be 13 characters long. If more_entropy is 
* true, it will be 23 characters. 
* </p> 
* @param more_entropy bool[optional] <p> 
* If set to true, uniqid will add additional 
* entropy (using the combined linear congruential generator) at the end 
* of the return value, which should make the results more unique. 
* </p> 
* @return string the unique identifier, as a string. 
*/ 
function uniqid ($prefix = null, $more_entropy = null) {} 
8

日付のタイムスタンプを使用すると、同じファイル名/時間を2度取得することはありません。

あなたのコードは次のように見えますが、あなたはこのような何かを行うことができ、まさに未特定:

$filename = uniqid() . $orig_filename; 

Read this documentation on the PHP docs about uniqid for more information。これは、datetimeを使用して一意の識別子文字列を出力します。

+0

申し訳ありません、私にいくつかの例を教えてください。 –

+0

まあ、それは、ユニークなIDを持つ名前をデータベースに変更します。そのようなもの:4eef63add36881162_03.JPG。しかし、イメージフォルダには元のイメージ名が表示されます。Like:1162_03.jpg元のイメージ名を正確にデータベースイメージ名に変更できますか? –

+0

この問題は修正されました。あなたの時間バットキンズありがとう。 –

0

データベースのフィールドにイメージ名を格納し、ユーザーがイメージをアップロードしてファイル名が既存のファイル名と照合して一意であることを検証するのが最も簡単な方法だと思います。あなたがフォームを提出してエラーを受け取ったり、ファイル名を変更するよう促すメッセージが表示されるまで、ユーザーが待たされることを避けたい場合は、ajax/jqueryインターフェイスを使用できます。

+0

しかし、私はもっと良い方法があると思います... –

+0

あなたはもっと良い方法を意味しますか?私は、他のコメントに示唆されているようなunique_idを使用するか、またはユーザー名をファイルに持たせるのが2つの最良の方法だと思いますか?顧客に名前を表示する予定がある場合は、ユーザーがユーザーフレンドリーな名前でファイル名を付けられるようにすることをお勧めします。それ以外の場合は、適切でない可能性のあるunique_idを顧客に表示します。 – Robert

3

ユニークなIDを生成するuniqid()機能を使用することができます。あなたは二つの異なるマシン上で非常に同じ時間でそれを実行した場合、それは同じことを生成することができ、すなわち、それだけで、一台のマシン間でユニークになるようものの

$filename = uniqid() . '.jpeg'; 

は注意してください。

+0

+1 'は、1台のマシンで一意であることに注意してください。つまり、2台のマシンで同時に実行すると同じものが生成されます。 –

1

IMOの最適なオプションはsha1_fileです。ファイルの内容に基づいて一意のハッシュが作成されます。これは、同じ画像またはハッシュ衝突の場合にのみ衝突します。この衝突は1/2^160チャンスです。ただし、ファイルからハッシュを作成するため、この方法でイメージが重複しないようにすることができます。これは、ファイルが遅くなる可能性があります。

$filename = sha1_file($upload_file) . $ext; 


別のオプションは、それは、一意の名前と一時ファイルを作成しますtempnamです。

注:PHPが指定されたパラメータdirにファイルを作成することができない場合、それはシステムのデフォルトにフォールバックします。

Basicの例:

$filename = tempnam($dir, $prefix); 
unlink($filename)//we don't need the tempfile just the name 

はまた、注意してください:あなたはファイル名を変更した場合は、それが一意でない可能性があります。

関連する問題