Когда удалять предварительно загруженные изображения с сервера?

Здравствуйте.

Реализовал в проекте предварительную загрузку изображений при создании объявления. То же, что и на авито, к примеру. Человек жмет на "Создать объявление", заполняет название, описание и проч., ниже кнопка с плюсиком - жмет, открывается диалоговое окно с выбором файлов. Как только файлы выбраны - сразу начинается загрузка на сервер, а на странице пользователя виден прогресс-бар.

Теперь проблема. Представим, что пользователь открыл вкладку, загрузил штук 20 изображений по 2 мегабайта размером (итого 40 мб уже занято, а 2мб - лимит одной картинки у меня), закрыл вкладку и ушел. Сорок метров картинок лежат на серваке.

Вопрос - а когда и по какому событию эти картинки логично было бы чистить?..

Первый вариант. Просто через какое-то время (сутки, к примеру) от момента загрузки.
Второй вариант. Отслеживать активность пользователя на странице создания объявления. Не активен 30 минут?.. Удаляем картинки.
Третий вариант. Сразу предупреждаем пользователя о том, что на создание объявления ему отведено 30 минут, после его нельзя будет отправить на сервер.

Какой из вариантов предпочтительнее?..
Или может есть какое иное устоявшееся и эффективное решение?..

Главное опасение.
Представим, пользователь зарегистрировался этак раз 1000 под разными аккаунтами.
Пооткрывал вкладок с целью насолить и в каждой загрузил по 20 файлов по 2 мб весу. Итого 40 гигов. Правильно я понимаю, что ситации с перегрузом диска, если проект на каком-нибудь 10-15 гиговом хостинге, не избежать никак, кроме как ограничивать одновременно создающих объявление каким-то лимитом (типа в данный момент недоступно создание и все такое)?..
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ответы на вопрос 5
@Kostik_1993
Web Developer
Все что вам написали брехня. Нужно делать так:
1. Создать в БД таблицу для картинок (у вас она уже и так есть)
2. Добавить к таблице поля date, confirm
3. При загрузке картинки сразу грузить ее по конечному пути, при этом поле confirm у нас должно быть (null, 0, no) в общем как угодно, для примера пусть будет 0 не подтвержденная, 1 подтвержденная
4. После отправки формы с объявлением даем картинкам статус подтвержденных
5. Например раз в сутки удаляем картинки дата зашрузки которых < например сегодня - 1 день
Ответ написан
@Quieteroks
php программист
Ограничивать по времени пользователя не хорошо. Я начал создавать объявление, меня позвала жена, вернулся через два часа, заполнил объявления, отправил форму и что мне скажет сервер? Первый вариант предпочтительнее, но его можно доработать дополнительными событиями. К примеру посылать ajax запрос с открытой страницы каждую минуту, на сервере обновлять "lock" файл, который отвечает за сохранность изображений, чекаем каждые 10 минут, удаляем если время обновления файла исчерпало время блокировки (к примеру 30 минут).
Ответ написан
vawsan
@vawsan
Frontend Developer
Есть вариант гораздо лучше - FileApi.
То есть вы их превьювите на странице прямо в браузере, не загружая на сервер. А загрузите в момент подачи объявления. И UX хороший и место не простаивает.
Ответ написан
@siptik
php developer, freelancer, Web-studio owner
Загружаешь картинки в темповую директорию и переносишь их в нужные папки только после создания объявления.
По крону вычищаешь темповую директорию например раз в сутки (удалять файлы, которые лежат в папке более x часов).
Можно использовать какие нибудь облачные хранилища, для темповых изображений и переносить их на сайт после подачи объявления. ( 1 ТБ 9,99 €/месяц. гугл драйв.)
Ответ написан
Когда надо удалять файлы? Тогда когда они не нужны. А не нужны когда закрыта страница с формой - это можно отследить на клиенте, сделать отбивку ajax-сообщением и удалить файлы. На случай неожиданного падения клиента можно повесить скрипт для периодической отбивки серверу, что клиент ещё жив, при этом обновлять время в базе и удалять по крону все файлы у которых дельта ушла за какое-то значение (10 минут, час... ). Думаю, основная масса будет удаляться по первому варианту.

Для защиты от перегруза, можете выделить под временные файлы отдельную директорию с квотой. При её переполнении переходите на вариант FileAPI, и загружайте только при сохранении.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы