В настоящее время я нахожусь в написании мобильного приложения с помощью 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 }