7

Googleで見つけたスニペットを使用して、ユーザーがアップロードした画像を取得し、コンテンツの下のディレクトリに配置します。

しかし、私は重複が心配だったので、画像を乱数としてアップロードしてもらうつもりでした

さてここに私のコードがありますあなたはおそらくそれを通して私が何をしているのか理解できるでしょう

<label for="file">Profile Pic:</label> <input type="file" name="ProfilePic" id="ProfilePic" /><br />

<input type="submit" name="submit" value="Submit" />

$ProfilePicName = $_FILES["ProfilePic"]["name"];
$ProfilePicType = $_FILES["ProfilePic"]["type"];
$ProfilePicSize = $_FILES["ProfilePic"]["size"];
$ProfilePicTemp = $_FILES["ProfilePic"]["tmp_name"];
$ProfilePicError = $_FILES["ProfilePic"]["error"];

$RandomAccountNumber = mt_rand(1, 99999);  
echo $RandomAccountNumber; 
move_uploaded_file($ProfilePicTemp, "Content/".$RandomAccountNumber.$ProfilePicType);

そして基本的に、このすべての後に、私のデータベースにその乱数を入れるようにしようとしています

誰かが私に新しいスニペットをくれましたが、それは私が望むことをするように見えますが、今ではファイルが私のディレクトリまで届いていません

$RandomAccountNumber = uniqid();
echo $RandomAccountNumber;

move_uploaded_file($ProfilePicName,"Content/".$RandomAccountNumber);
4

5 に答える 5

20

phpuniqidメソッドを使用して、必要な一意のIDを生成してみてください

http://php.net/manual/en/function.uniqid.php

$RandomAccountNumber = uniqid();
move_uploaded_file($ProfilePicTemp, "Content/" . $RandomAccountNumber);
于 2012-11-20T22:41:50.813 に答える
5

画像をアップロードするときは、通常sha1()、画像のコンテンツとして保存します(sha1_file())。そうすれば、1つの石で2羽の鳥を手に入れることができます。ファイル名が重複することは決してありません(そうする場合は、最も近い宝くじに記入してください)。また、画像の重複を防ぐことができます(重複する画像のチェックサムは同じであるため)。 。

次に、どの画像がどれであるかを分類し、ユーザーに正しく表示するためのデータベースがあります。

于 2012-11-20T22:42:26.893 に答える
5

これは私が写真をアップロードするときに使用するものです:session_id()time()とランダムな文字列の組み合わせ:

$rand = genRandomString();
$final_filename = $rand."_".session_id()."_".time();

function genRandomString() 
{
    $length = 5;
    $characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWZYZ";

    $real_string_length = strlen($characters) ;     
    $string="id";

    for ($p = 0; $p < $length; $p++) 
    {
        $string .= $characters[mt_rand(0, $real_string_length-1)];
    }

    return strtolower($string);
}

これがお役に立てば幸いです。

于 2012-11-20T23:00:40.263 に答える
3

random != unique

「ランダムな」ファイル名を生成するためにどの方法を使用する場合でも、衝突を回避するためにこれを実行することをお勧めします。

$path = '/path/to/directory/';
do {
    $filename = some_function();
} while( file_exists($path.$filename) );

これはそれほど必要なことではありませんが、100万分の1のファイル名の衝突が発生した場合の安心感を求めているだけなら、これらの2行の余分な行でうまくいきます。

于 2012-11-20T22:51:26.753 に答える
1

私のお気に入りのCodingHorrorの記事の1つは、このアプローチが見た目よりも面倒である理由を取り上げています。...uniqidの代わりに次のようなものを使用する必要がありますmt_rand(1, 99999);...

于 2012-11-20T22:47:44.750 に答える