Как создать решение, ограничивающее хранение пользователей в приложении?

Я не могу найти подходящее решение для ограничения объема хранения, доступного пользователю с его файлами.

В приложении пользователям разрешено загружать лимитный объем файлов. Ограничение основано на общем размере файла. Т.е. пользователю может быть разрешено хранить 50 Мб на сервере.

Этот номер хранится в базе данных, так что его можно легко увеличить / уменьшить.

Используемый язык – это PHP, но я думаю, что решение не зависит от языка сценариев.

Очень жаль, если вопрос неясен. Я действительно не знаю, что попросить больше, чем стратегия для реализации.

Благодаря!

Отслеживание того, сколько места было использовано, должно быть простым: при каждой загрузке вы можете сохранить пространство, используемое в другой таблице. Функция PHP filesize() сообщит вам размер файла на диске. Используйте SQL-запрос SUM() чтобы получить общий размер всех файлов, загруженных каждым пользователем, и сравнить их с их лимитом квоты.

Трудный бит – это когда вы приближаетесь к пределу – вы не можете сказать, насколько большой будет файл до его загрузки. Таким образом, вам нужно будет заставить пользователя загрузить файл, а затем проверить его размер и посмотреть, не требует ли он их квоты. Если файл слишком большой, удалите и сообщите пользователю, что они не в космосе.

Простым подходом было бы хранить имя файла, даты и размеры пользователей, загружаемых в базу данных. Затем вы можете легко отказаться от загрузки, когда она превышает их общую память.

Это также упрощает отображение списка файлов, отсортированных по-разному, позволяя пользователю приблизиться к своему пределу, чтобы выбрать некоторые файлы для удаления.

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

Вы можете использовать скрипт (что-то вроде этого ), который выполняет итерацию через содержимое каталога, вычисляет файлы, а затем удаляет файлы, которые не соответствуют или не отклоняют новые загрузки. Но я думаю, что это лучше сделать с некоторыми ограничениями на сервере на сервере. К сожалению, я не парень Linux, поэтому я точно не знаю, как это сделать, но этот пост может быть полезен.

Решение drewm хорошо, я просто хочу добавить несколько слов о сложной части, о которой он упомянул.

Да, предсказать размер файла до загрузки файла невозможно, так как вы не можете проверить размер файла, используя javascript на странице загрузки файлов. Однако вы можете сделать это, используя флеш-загрузчик файлов (например, swfupload.org). Используя его, вы можете проверить размер файлов до начала загрузки и проверить его на ограничение загрузки. Таким образом, вы сэкономите время для пользователя (нет необходимости загружать файл, чтобы получить сообщение «limit over error»).

В качестве бонуса вы также можете показать индикатор выполнения загрузки пользователя.

Не забывайте о решениях ОС. Если файлы хранятся в специальном каталоге «пользователь», вы можете использовать ОС для поиска дискового пространства, используемого в этом каталоге. Решение Linux будет примерно таким:

 $dirSize = explode("\t", `du -ks $userDir`); // Will return an array of size, dirName if ($dirSize[0] > MAX_DIR_LIMIT) print "USER IS OVER QUOTA";