iproger
@iproger
Безответственный гений

Нормальный ли метод хранения файлов на сервере?

Задача: юзер без регистрации может заливать и скачивать свои файлы. В дальнейшем он может зарегистрироваться и получить дополнительный функционал.

Идея хранения файлов.
Есть класс-хранилище, способный писать, читать и хранить массив файлов по ключу (md5). Структура:
/user_files/ef/eff7d5dba32b4da32d9a67a519434d3f.zip
/user_files/d5/d58e3582afa99040e27b92b13c8f2280.zip

Есть класс-контроллер, управляющий классом-хранилище (с контролем доступа). Генерация ключа происходит, например, по такой схеме: md5(user_id+file_name+...). В базе хранится user_id, оригинальное имя файла и ключ.
Скачивание (отдается через php):
/user-files/download/d58e3582afa99040e27b92b13c8f2280/ -> Мой документ.zip


1. Все файлы на 1 сервере.
2. Высоких нагрузок не ожидается.

Есть ли минусы в данной схеме?
  • Вопрос задан
  • 2423 просмотра
Пригласить эксперта
Ответы на вопрос 7
zooks
@zooks
Frontend и Django
MD5 не уникальна - чисто теоретически они могут повторяться.
Ответ написан
И еще "Скачивание (отдается через php)" можно заменить на скачивание через X-Accel-Redirect если стоит nginx
Ответ написан
Комментировать
mannaro
@mannaro
Умею профессионально гуглить
Нормальная система.
Ответ написан
Комментировать
zoonman
@zoonman
В голове туман? - Кури ман!
Схема неплохая, но лучше использовать sha1_file() для обнаружения одних и тех же файлов. Т.е. сначала генерировать контрольную сумму, потом искать в базе по ней дубликат, если он есть, проверять совпадение файлов (это может занять время, должен быть продуман фоновый процесс обработки). Если файлы одинаковые, то нет смысла хранить копии. В таком случае схема в базе немного усложняется, но значительно экономится место на диске из-за дедупликации.
Метаданные для каждого пользователя необходимо хранить индивидуально и ссылку выдавать уникальную для каждого пользователя.
Ответ написан
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Вполне нормальная система
Сам делаю почти так же. Только файлы "безликие". Название и мета в базе.
Отдается через php, сами папки естественно закрыты.
  • /uploads/03.05.2014/2a7db79344e0bfe58975de0b505310c6
  • /uploads/03.05.2014/37d7af3859d055fc8685334b03b052dd
Ответ написан
BuriK666
@BuriK666
Компьютерный псих
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Минусы стандартные.
  • На миллион файлов одного уровня вложенности хватит, но на десяти уже начнутся проблемы, когда в каждом каталоге будет по несколько десятков файлов. Я помню про "не больше ляма", но "640К памяти хватит всем...", ога.
  • Заведомо неуникальные имена файлов пользователей. Не забыть прибавлять к хэшируемой строке микротайм.
  • Следить, чтобы у хэшируемой строки не было общего префикса (скажем, полного пути к файлу на диске) - тогда первые символы хэша будут распределяться неравномерно, и неравномерно заполнять каталоги.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы