За последние 24 часа нас посетили 57456 программистов и 1683 робота. Сейчас ищут 1176 программистов ...

Загрузка файлов на сервер (теория)

Тема в разделе "PHP для новичков", создана пользователем Зингер, 25 июл 2018.

  1. Зингер

    Зингер Активный пользователь

    С нами с:
    20 июл 2017
    Сообщения:
    127
    Симпатии:
    7
    Собственно, имеются 2 вопроса по теории:

    1) После загрузки файлика на сервер, файл веб-сервером переименовывается в <tmp_name>.tmp
    Собственно вопрос по tmp_name. Это имя уникально в пределах сервера? Дело в том, что есть желание оставлять это имя как есть, подсовывая только расширение.

    2)На разных ресурсах советуют использовать copy(), а не move_uploaded_file() во время загрузки файла. Т.к. я только в начале пути написания нового приложения, хотелось бы сразу прояснить ситуацию.

    Спасибо.
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    у меня в основном проекты где нужно грузить картинки.. поэтому я делаю все на JS))
    1. Чел выбрал картинку - она загрузилась в див и сразу показало на экране то что человек грузит.. т.е. Картинка уже на странице в data:URL
    2. Потом он нажал кнопку - аяксом отправили POST запрос на сервер - и там картинку уже сохранили..

    Уникальные имена создаю на лету.. плюс создаю иерархию каталогов /ГГГГ/ММ/ДД что бы в одной директории не было 100500 изображений..
     
  3. Зингер

    Зингер Активный пользователь

    С нами с:
    20 июл 2017
    Сообщения:
    127
    Симпатии:
    7
    Да-да, FileReader + FormData + $.ajax()... Также и у меня.
    Вопрос в уникальности имен. Уникальность обеспечивает php сам? Именем *.tmp?
     
  4. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Зингер не надо смотреть на разные ресурсы есть мануал в котором написано как. И как там написано так и делайте! Не ошибётесь.
    --- Добавлено ---
    Там даже примеры есть как это сделать.
     
  5. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    когда то давно сделал)) теперь тягаю из проекта в проект))
    PHP:
    1.     /**
    2.      * Сегоднящний текущий путь
    3.      * @global $boarddir
    4.      * @return boolean|string
    5.      */
    6.     public function getTodayPath() {
    7.         global $boarddir;
    8.  
    9.         $abs_path_for_save = $boarddir . '/' . 'ADSImages';
    10.  
    11.         //назначили путь ГОД
    12.         $year = '/' . ( (string) date('Y') );
    13.  
    14.         //назначили путь ГОД/МЕСЯЦ
    15.         $mount = '/' . ( (string) date('m') );
    16.  
    17.         //назначили путь ГОД/МЕСЯЦ/ДЕНЬ  
    18.         $day = '/' . ( (string) date('d') );
    19.  
    20.         //назначили путь ГОД
    21.         $full_path_year = $abs_path_for_save . $year;
    22.  
    23.         //назначили путь ГОД/МЕСЯЦ
    24.         $full_path_mount = $full_path_year . $mount;
    25.  
    26.         //назначили путь ГОД/МЕСЯЦ/ДЕНЬ
    27.         $full_path_day = $full_path_mount . $day;
    28.  
    29.         //проверили есть ли путь
    30.         if (!is_dir($full_path_day)) {
    31.             //если нет то создали
    32.             if (!is_dir($full_path_year)) {
    33.                 if (!mkdir($full_path_year, 0755)) {
    34.                     return FALSE;
    35.                 }
    36.             }
    37.             if (!is_dir($full_path_mount)) {
    38.                 if (!mkdir($full_path_mount, 0755)) {
    39.                     return FALSE;
    40.                 }
    41.             }
    42.             if (!is_dir($full_path_day)) {
    43.                 if (!mkdir($full_path_day, 0755)) {
    44.                     return FALSE;
    45.                 }
    46.             }
    47.         }
    48.  
    49.         $path_day = $year . $mount . $day;
    50.  
    51.         //Если все удачно то вернули полный путь
    52.         return $path_day;
    53.     }
    54.  
    55.     /**
    56.      * Сгенерировать имя файла
    57.      * @global $boarddir
    58.      * @param string $path_file
    59.      * @param type $type
    60.      * @return string
    61.      */
    62.     public function newName($path_file, $type = 'jpg') {
    63.         global $boarddir;
    64.  
    65.         $path_file = $boarddir . $path_file;
    66.         $cut_sym = 5;
    67.         $filename = '' . mb_substr(md5(microtime()), 0, $cut_sym) . '.' . $type . ''; //создали уникальное имя
    68.         //проверили на совпадение
    69.         while (is_file('' . $path_file . '/' . $filename . '')) {
    70.             //создали уникальное имя
    71.             $filename = '' . mb_substr(md5(microtime()), 0, $cut_sym) . '.' . $type . '';
    72.         }
    73.  
    74.         //вернули уникальное имя
    75.         return $filename;
    76.     }
     
  6. Зингер

    Зингер Активный пользователь

    С нами с:
    20 июл 2017
    Сообщения:
    127
    Симпатии:
    7
    @Алекс8. Понятно, ключевой момент здесь md5(). Спасибо.
     
  7. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    в одном проекте делал вот как еще.. файлам генерю случайные имена... а в базу пишу оригинальные имена..
    а потом файлы отдают не напрямую а через скрипт.. и получается что отдачу файла можно контролировать правами доступа - и в тоже время сохраняются оригинальные имена файлов)