Когда удалять предварительно загруженные изображения с сервера?
Здравствуйте.
Реализовал в проекте предварительную загрузку изображений при создании объявления. То же, что и на авито, к примеру. Человек жмет на "Создать объявление", заполняет название, описание и проч., ниже кнопка с плюсиком - жмет, открывается диалоговое окно с выбором файлов. Как только файлы выбраны - сразу начинается загрузка на сервер, а на странице пользователя виден прогресс-бар.
Теперь проблема. Представим, что пользователь открыл вкладку, загрузил штук 20 изображений по 2 мегабайта размером (итого 40 мб уже занято, а 2мб - лимит одной картинки у меня), закрыл вкладку и ушел. Сорок метров картинок лежат на серваке.
Вопрос - а когда и по какому событию эти картинки логично было бы чистить?..
Первый вариант. Просто через какое-то время (сутки, к примеру) от момента загрузки. Второй вариант. Отслеживать активность пользователя на странице создания объявления. Не активен 30 минут?.. Удаляем картинки. Третий вариант. Сразу предупреждаем пользователя о том, что на создание объявления ему отведено 30 минут, после его нельзя будет отправить на сервер.
Какой из вариантов предпочтительнее?..
Или может есть какое иное устоявшееся и эффективное решение?..
Главное опасение.
Представим, пользователь зарегистрировался этак раз 1000 под разными аккаунтами.
Пооткрывал вкладок с целью насолить и в каждой загрузил по 20 файлов по 2 мб весу. Итого 40 гигов. Правильно я понимаю, что ситации с перегрузом диска, если проект на каком-нибудь 10-15 гиговом хостинге, не избежать никак, кроме как ограничивать одновременно создающих объявление каким-то лимитом (типа в данный момент недоступно создание и все такое)?..
Все что вам написали брехня. Нужно делать так:
1. Создать в БД таблицу для картинок (у вас она уже и так есть)
2. Добавить к таблице поля date, confirm
3. При загрузке картинки сразу грузить ее по конечному пути, при этом поле confirm у нас должно быть (null, 0, no) в общем как угодно, для примера пусть будет 0 не подтвержденная, 1 подтвержденная
4. После отправки формы с объявлением даем картинкам статус подтвержденных
5. Например раз в сутки удаляем картинки дата зашрузки которых < например сегодня - 1 день
В целом, конечно, я примерно на таком варианте и стою.
Но если удалять раз в сутки, то злоумышленник может нагрузить за сутки столько файлов, что хостер меня отключит.
Хайбулла Мусаев: можете хоть каждый час запускать, можете навешать событие хоть на размер директории или остаток свободного места, это очень правильное решение, так делают крупные ребята, а вобще для крупного проекта лучше использовать VPS или же дедик, а изображения и вовсе хранить в облаке
Хайбулла Мусаев: а вообще мания боязни конкурентов или злоумышленников, это очень плохая затея, они всегда найдут дыру, так что не нужно думать об этом
Ограничивать по времени пользователя не хорошо. Я начал создавать объявление, меня позвала жена, вернулся через два часа, заполнил объявления, отправил форму и что мне скажет сервер? Первый вариант предпочтительнее, но его можно доработать дополнительными событиями. К примеру посылать ajax запрос с открытой страницы каждую минуту, на сервере обновлять "lock" файл, который отвечает за сохранность изображений, чекаем каждые 10 минут, удаляем если время обновления файла исчерпало время блокировки (к примеру 30 минут).
Есть вариант гораздо лучше - FileApi.
То есть вы их превьювите на странице прямо в браузере, не загружая на сервер. А загрузите в момент подачи объявления. И UX хороший и место не простаивает.
Ваш вариант я частично использую. При выборе картинок они сразу отображаются на экране, а внизу прогресс-бар. Только пока они не загружены, они идут с полупрозрачностью. Как загрузились - убираю полупрозрачность.
Основная проблема вот в чем. Иной раз картинок бывает указано 20 штук. У каждой солидный вес. А скорость соединения с интернетом можем быть 3G-шной, к примеру. И выходит вот что - отправляя страницу пользователь долгое время может видеть тупо белый экран (минуту, две, три). Тут он может не понять, что к чему и закрыть вкладку.
Хайбулла Мусаев: Можно попробовать информировать его о загрузке картинок. Крутите спиннер и показываете цифру с процентами от уже загруженных файлов. Просто грузить же можно не только формой, а через ajax.
Загружаешь картинки в темповую директорию и переносишь их в нужные папки только после создания объявления.
По крону вычищаешь темповую директорию например раз в сутки (удалять файлы, которые лежат в папке более x часов).
Можно использовать какие нибудь облачные хранилища, для темповых изображений и переносить их на сайт после подачи объявления. ( 1 ТБ 9,99 €/месяц. гугл драйв.)
Когда надо удалять файлы? Тогда когда они не нужны. А не нужны когда закрыта страница с формой - это можно отследить на клиенте, сделать отбивку ajax-сообщением и удалить файлы. На случай неожиданного падения клиента можно повесить скрипт для периодической отбивки серверу, что клиент ещё жив, при этом обновлять время в базе и удалять по крону все файлы у которых дельта ушла за какое-то значение (10 минут, час... ). Думаю, основная масса будет удаляться по первому варианту.
Для защиты от перегруза, можете выделить под временные файлы отдельную директорию с квотой. При её переполнении переходите на вариант FileAPI, и загружайте только при сохранении.