Скрыть объявление
ВАШИ ПРАВА ОГРАНИЧЕНЫ!

Зарегистрируйтесь на форуме, чтобы стать полноценным участником сообщества!

Вопрос? Как минимизировать совпадение в название файлов при заливке?

Тема в разделе "Вопросы- ответы", создана пользователем Bashmak, 14 сен 2020.

14.09.20 в 11:24
15.09.20 в 09:09
10
461
0
  1. TopicStarter Overlay
    Bashmak

    PRO Users

    Регистрация:
    25 фев 2017
    Сообщения:
    642
    Лучших ответов:
    1
    Рейтинги:
    +167 / 25 / -0
    Добрый день.

    У меня возникла вот такая проблема.

    Юзер с сайта добавляет подряд друг за другом новости, делается это с большой скоростью, например за одну минуту он может добавить 2 новости.

    На рассмотрение возьмём 2 новости.
    Время добавления новостей:
    2020-09-14 05:03:55 новость 1
    2020-09-14 05:04:29 новость 2

    В каждую новость в доп поле тип "галерея изображений" юзер заливает картинки, пронумерованные по порядку, 1.jpg 2.jpg 3.jpg и так далее

    В новость 1 он залил 25 картинок
    В новость 2 он залил 36 картинок

    Проблема вот в чём, когда он заливал файлы во вторую новость, файлу 25.jpg присвоился такой же префикс как и в первой новости, вот так 1600049079_25.jpg, и произошла перезапись файла, в следствии чего в двух новостях мы имеем 2 одинаковых файла с названием 1600049079_25.jpg, а по факту один файл.

    На сколько я знаю префикс задаётся в файле engine\classes\uploads\upload.class.php
    Верно?)

    Там встречается 2 раза строка
    Код:
    $file_prefix = time() + rand( 1, 100 );
    Могу ли я rand( 1, 100 ) заменить на rand( 1, 5000 ) ?
    Не повлечёт ли это каких либо последствий на работу загрузчика файлов?
    А если нет, то насколько ещё можно увеличить диапазон рандома цифр, чтобы минимизировать процент совпадения до нуля?
     
  2. Pr00f

    Pr00f Бывалый

    Регистрация:
    4 фев 2019
    Сообщения:
    405
    Лучших ответов:
    0
    Рейтинги:
    +164 / 12 / -0
    даа, очень большая скорость :D

    можешь. ничего плохого не случится. но шанс перезаписи все равно остается. это рандом и шанс 0 никогда не будет
    вместо rand() лучше использовать более улучшенную версию - random_int(1, PHP_INT_MAX), тогда будет использованно максимальное значение, которое зависит от версии операционной системы. на 64 битных ос максимальное значение будет 9223372036854775807. этого хватит с большим запасом
    для гарантированной уникальности используют GUID либо что-то схожее, но тут это уже перебор
     
    #2 Pr00f, 14 сен 2020
    Последнее редактирование: 14 сен 2020
  3. TopicStarter Overlay
    Bashmak

    PRO Users

    Регистрация:
    25 фев 2017
    Сообщения:
    642
    Лучших ответов:
    1
    Рейтинги:
    +167 / 25 / -0
    Ну типа да, он же это руками всё делает, помимо этого ещё пару полей должен заполнить. 30 сек на одну новость, вполне шустро)

    Как я понял и этот вариант не минимизирует шанс до нуля?)

    На другом сайте мне посоветовали использовать uniqid
    Может как-то так тогда?)
    Код:
    $file_prefix = time() + random_int(1, PHP_INT_MAX) + uniqid();
     
  4. Pr00f

    Pr00f Бывалый

    Регистрация:
    4 фев 2019
    Сообщения:
    405
    Лучших ответов:
    0
    Рейтинги:
    +164 / 12 / -0
    можно использовать один лишь uniqid(). для загрузки файлов вполне подойдет. ну для верности можно еще добавить рандом. и убрать time() - тут он все равно ничего не решит уже
    и т.к. uniqid возвращает строку, то надо склеивать через точку
    Код:
    $file_prefix = random_int(1, PHP_INT_MAX) . uniqid();
     
    • Нравится Нравится x 1
  5. TopicStarter Overlay
    Bashmak

    PRO Users

    Регистрация:
    25 фев 2017
    Сообщения:
    642
    Лучших ответов:
    1
    Рейтинги:
    +167 / 25 / -0
    Спасибо, попробую.

    Всё же на всякий случай и time тоже оставлю)
    Вот так норм будет работать?
    Код:
    $file_prefix = time() + random_int(1, PHP_INT_MAX) . uniqid();
     
  6. TopicStarter Overlay
    Bashmak

    PRO Users

    Регистрация:
    25 фев 2017
    Сообщения:
    642
    Лучших ответов:
    1
    Рейтинги:
    +167 / 25 / -0
    Или так надо?
    Код:
    $file_prefix = time() . random_int(1, PHP_INT_MAX) . uniqid();
     
  7. Pr00f

    Pr00f Бывалый

    Регистрация:
    4 фев 2019
    Сообщения:
    405
    Лучших ответов:
    0
    Рейтинги:
    +164 / 12 / -0
    2й вариант, все через точку

    Код:
    $file_prefix = time() . random_int(1, PHP_INT_MAX) . uniqid();
     
    • Полезно Полезно x 1
  8. dr.gopher

    Команда форума VIP Кинотрафик v2

    Регистрация:
    26 июн 2015
    Сообщения:
    1.546
    Лучших ответов:
    8
    Рейтинги:
    +444 / 44 / -0
    Не проще, пакетно переименовывать картинки?
     
  9. TopicStarter Overlay
    Bashmak

    PRO Users

    Регистрация:
    25 фев 2017
    Сообщения:
    642
    Лучших ответов:
    1
    Рейтинги:
    +167 / 25 / -0
    Это как?
     
  10. dr.gopher

    Команда форума VIP Кинотрафик v2

    Регистрация:
    26 июн 2015
    Сообщения:
    1.546
    Лучших ответов:
    8
    Рейтинги:
    +444 / 44 / -0
    Это не 1.ipg 2.ipg 3.ipg, а 1-слово.ipg

    Способов переименования по маске много. Как варик тыц
     
  11. TopicStarter Overlay
    Bashmak

    PRO Users

    Регистрация:
    25 фев 2017
    Сообщения:
    642
    Лучших ответов:
    1
    Рейтинги:
    +167 / 25 / -0
    Не, это не вариант. Доступ на добавление открыт для всех юзеров, они тупо скачивают архивы с других источников, разархивируют и заливают всё так как есть ничего не меняя, и хрен их заставишь) Да и оно и к лучшему, накосячить могут при переименовании.
     
Яндекс.Метрика