(чтоб не было больно)
Допустим, выбрали S3. Теперь вопрос: как придумывать ключи (имена объектов)?
❌ Что нельзя делать
Плохо: Ключ = оригинальное имя файла
document.pdfПользователь может назвать файл
../../../config.json - жди взлома системы.Два пользователя загрузят
report.pdf — файл перезапишется, данные будут утеряны.Плохо: Все файлы складывать в одну папку
assets/ и туда все подряд.S3 тормозит, если в одном префиксе больше 100 000 объектов (на самом деле не строго, но для понимания - да).
✅ Что можно делать
📔 Хороший паттерн для старта:
assets/{user_id}/{category}/{uuid}.{ext}Пример:
assets/12345/avatar/a1b2c3d4-5678.jpgПочему так:
user_id - быстро найти все файлы пользователяuuid - уникальный идентификатор, никогда не повторяетсяПапки на самом деле в S3 виртуальные, но для человека удобно
📔 Продвинутый паттерн (для больших объемов):
{md5_hash[:3]}/{uuid}.{ext}Пример:
a1b/123e4567-e89b-12d3.jpgПервые 3 символа хэша нужны, чтобы равномерно размазать файлы и S3 не тормозил.