Простейший самописный вариант: от файла берется md5 сумма, для примера: abcdef01234567890123456789012345. Вычисляется путь к файлу (лучше в древовидном виде), как можно использовать: /path/to/storage/ab/cd/ef/01234567890123456789012345. Дальше в БД записывается оригинальное имя, хэш и рассчитанный путь к файлу. При получении запроса на вывод файла - определяем из БД путь к файлу и отдаем его.
Правда этот вариант только на один сервер, в случае прям облака - файл должен еще и копироваться мещду каким-то количеством серверов, для сохранности и доступности.
Есть старая добрая mogilefs, хранит файлы чанками в БД, автоматически копирует чанки между серверами. При загрузке возвращает идентификатор, по которому потом можно этот файл достать.
Есть minio - это совместимая альтернатива s3 для разворачивания на своих серверах. Принцип работы похож на помесь первого и второго. Правда можно и без хэша в имени.