8

私は現在、phonegapの助けを借りてモバイルアプリを書いているところです。このアプリに持たせたい数少ない機能の1つは、画像をキャプチャしてリモートサーバーにアップロードする機能です...

私は現在、コンパイルされたapkで画像のキャプチャとアップロード/メール送信の部分が正常に機能しています...しかし私のphpでは、現在画像に「image[10から20までの乱数を挿入]...」という名前を付けています...ここでの問題は数字を繰り返したり、画像を上書きしたりできます... rand()を使用して、0からgetrandmax()までの乱数を選択することを読んで考えましたが、ファイルの可能性は同じだと思います。上書き...何があっても、毎回一意の名前で画像をサーバーにアップロードする必要があります...そのため、phpスクリプトはサーバーが既に持っているものを確認し、一意の画像を書き込み/アップロードします名前...

「rand()」以外のアイデアはありますか?

また、各画像に名前を付けることも考えていました... img +日付+時刻+文字と数字を含むランダムな5文字...したがって、2013年3月20日の午前4時37分にアプリを使用して画像を撮影した場合、サーバーにアップロードすると、画像の名前は「img_03-20-13_4-37am_e4r29.jpg」のようになります...それでうまくいくと思います...(より良い方法がない限り)しかし、私はphpとそのようなものを書く方法を理解しないでしょう...

私のPHPは次のとおりです...

print_r($_FILES);
$new_image_name = "image".rand(10, 20).".jpg";
move_uploaded_file($_FILES["file"]["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name);

助けていただければ幸いです...よろしくお願いします!また、私が省略しているかもしれないさらなる情報があれば私に知らせてください...

4

4 に答える 4

18

PHPのuniqid()機能を検討することをお勧めします。このように、提案したコードは次のようになります。

$new_image_name = 'image_' . date('Y-m-d-H-i-s') . '_' . uniqid() . '.jpg';
// do some checks to make sure the file you have is an image and if you can trust it
move_uploaded_file($_FILES["file"]["tmp_name"], "/home/virtual/domain.com/public_html/upload/".$new_image_name);

また、サーバーのランダム関数は実際にはランダムではないことにも注意してください。本当にランダムなものが必要な場合は、random.orgを試してください。ランダムランダムランダム。

UPD:コード内からrandom.orgを使用するには、サーバーに対していくつかのAPIリクエストを実行する必要があります。そのドキュメントはここから入手できます:www.random.org/clients/http/

呼び出しの例は次のようになりますrandom.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=newドキュメントminで説明されているように、、maxおよびその他のパラメータを変更できることに注意してください。

PHPでは、関数、ライブラリ、さらにはソケットGETを使用して、リモートサーバーにリクエストを送信できます。共有ホスティングを使用している場合は、発信接続が利用可能であり、アカウントで有効になっている必要があります。file_get_contents()cURL

$random_int = file_get_contents('http://www.random.org/integers/?num=1&min=1&max=1000000000&col=1&base=10&format=plain&rnd=new');
var_dump($random_int);
于 2013-03-20T09:29:34.117 に答える
1

md5_file の使用を検討しましたか? そうすれば、すべてのファイルに一意の名前が付けられ、名前の重複を心配する必要がなくなります。ただし、内容が同じ場合は同じ文字列を返すことに注意してください。

ここにも別の方法があります:

do {
  $filename = DIR_UPLOAD_PATH . '/' . make_string(10) . '-' . make_string(10) . '-' . make_string(10) . '-' . make_string(10);
} while(is_file($filename));

return $filename;

/**
* Make random string
*
* @param integer $length
* @param string $allowed_chars
* @return string
*/
function make_string($length = 10, $allowed_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890') {
  $allowed_chars_len = strlen($allowed_chars);

  if($allowed_chars_len == 1) {
    return str_pad('', $length, $allowed_chars);
  } else {
    $result = '';

    while(strlen($result) < $length) {
      $result .= substr($allowed_chars, rand(0, $allowed_chars_len), 1);
    } // while

    return $result;
  } // if
} // make_string
于 2013-03-20T09:23:52.367 に答える