загружать изображения через php, используя уникальные имена файлов

В настоящее время я нахожусь в написании мобильного приложения с помощью phonegap. Одной из немногих функций, которые мне бы хотелось, чтобы это приложение было, – это возможность захватить изображение и загрузить его на удаленный сервер …

В настоящее время у меня есть захват изображения и загрузка / отправка по электронной почте части, отлично работающей с скомпилированным apk … но в моем php я сейчас нахожу имена изображений «image [insert random number from 10 to 20] … Проблема здесь в том, что числа могут быть повторены и изображения могут быть перезаписаны … Я прочитал и подумал о том, что просто использовал rand () и выбрал случайное число от 0 до getrandmax (), но я чувствую, что у меня может быть такая же вероятность файла перезапись … Мне нужно, чтобы изображение загружалось на сервер с уникальным именем каждый раз, независимо от того, что … поэтому скрипт php проверил бы, чтобы увидеть, что сервер уже имеет, и написать / загрузить изображение с уникальным имя…

любые идеи, кроме «rand ()»?

Я также думал о том, чтобы называть каждое изображение … img + дата + время + случайные 5 символов, которые будут содержать буквы и цифры … так что если изображение было взято с помощью приложения в 4:37 утра 20 марта 2013 года , изображение будет называться «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); 

Любая помощь приветствуется … Спасибо заранее! Также, пожалуйста, дайте мне знать, если есть какая-либо дополнительная информация, которую я могу оставить без внимания …

Вы можете рассмотреть функцию uniqid() PHP. Таким образом, код, который вы предложили, будет выглядеть следующим образом:

 $new_image_name = 'image_' . date('YmdHi-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 на свои серверы. Документацию по этому вопросу можно найти здесь: http://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); 

Вы должны использовать tempnam() для создания уникального имени файла:

 // $baseDirectory Defines where the uploaded file will go to // $prefix The first part of your file name, eg "image" $destinationFileName = tempnam($baseDirectory, $prefix); 

Расширение вашего нового файла должно быть выполнено после перемещения загруженного файла, то есть:

 // Assuming $_FILES['file']['error'] == 0 (no errors) if (move_uploaded_file($_FILES['file']['tmp_name'], $destinationFileName)) { // use extension from uploaded file $fileExtension = '.' . pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); // or fix the extension yourself // $fileExtension = ".jpg"; rename($destinationFileName, $destinationFileName . $fileExtension); } else { // tempnam() created a new file, but moving the uploaded file failed unlink($destinationFileName); // remove temporary file } 

Считаете ли вы использование 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 

Функция будет создавать уникальное имя перед загрузкой изображения.

 // Upload file with unique name if ( ! function_exists('getUniqueFilename')) { function getUniqueFilename($file) { if(is_array($file) and $file['name'] != '') { // getting file extension $fnarr = explode(".", $file['name']); $file_extension = strtolower($fnarr[count($fnarr)-1]); // getting unique file name $file_name = substr(md5($file['name'].time()), 5, 15).".".$file_extension; return $file_name; } // ends for is_array check else { return ''; } // else ends } // ends }