Имя для файла хешируется в случайную строку в шестнадцатеричном формате. Файл сохраняется в директорию название которой - это первые n символов имени файла. Например, если n = 2, а имя файла 0aac4e6a54c170b06e2bd3848d2b735e.jpg то файл будет сохранен по такому пути upload/avatars/0a/0aac4e6a54c170b06e2bd3848d2b735e.jpg
При двух символах файлы будут раскладываться равномерно по 256 директориям. Можно использовать другое количество символов или вложенные директории (0a/ac/4e/6a), смотря сколько у вас будет файлов.
Таким образом зная только название файла и алгоритм по которому происходит разбиение мы можем построить полный путь до файла.
Или. Можно каждый раз при сохранении файла проверять сколько файлов есть в директории. Если больше лимита, то создавать новую директорию, сохранять в нее и записывать в БД полный путь до файла.