загрузка изображений через php с использованием уникальных имен файлов
в настоящее время я пишу мобильное приложение с помощью phonegap. Одна из немногих функций, которые я хотел бы, чтобы это приложение было возможность захватить изображение и загрузить его на удаленный сервер...
в настоящее время у меня есть захват изображения и загрузка/отправка по электронной почте часть работает нормально с скомпилированным apk... но в моем php я в настоящее время называю изображения "image[вставить случайное число от 10 до 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);
любая помощь приветствуется... Заранее спасибо! Кроме того, Пожалуйста, дайте мне знать, если есть какая-либо дополнительная информация, которую я могу оставить...
4 ответов
вы можете рассмотреть 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);
вы должны использовать tempnam()
чтобы создать уникальное имя файла:
// $baseDirectory Defines where the uploaded file will go to
// $prefix The first part of your file name, e.g. "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
}