загрузка изображений через 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
}