Найти в Дзене

Загрузка файлов для пустых сущностей. PHP

Фото с Яндекс.Картинки
Фото с Яндекс.Картинки

Описание проблемы.

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

Фото с Яндекс.Картинки
Фото с Яндекс.Картинки

Заказчик видит форму и говорит: "Хочу чтобы при выборе картинок сразу появлялись preview и их можно было удалять/заменять".

Надо так надо.

Когда товар уже сохранен в БД проблем не возникает, вешаем событие на onchange поля выбора файлов и отправляем их на сервер (ajax), привязываем к текущему товару, генерируем preview и отдаем в ответ на ajax запрос.

Но как поступить если вы только начали создавать товар, и записи в БД о нем еще нет?!

вариант первый:

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

Вариант рабочий, но что если товар начали заполнять, загрузили картинку, а из-за стенки довольный Игорь кричит: "Ура! Я добавил этот товар!!!". Удалять товар? (что не есть хорошо, в 99% систем товары не удаляются а лишь добавляется признак что он удален, в итоге БД растет как PHP слон)

вариант два(все гениальное просто):

Вовсе запретить загрузку файлов до создания товара. Вариант рабочий, но срок годности истек еще в ~2014 году.

вариант три: (или то как делаю я):

При создании нового товара необходимо создать ссылку с произвольным несуществующим tmp_UID.

Выбираем файлы, отправляем на сервер (ajax), генерируем preview (если требуется), далее нам необходимо поставить cookie или открыть сессию, в которой мы пропишем key =tmp_UID, а в качестве значений - массив загруженных файлов.

При сохранении товара мы должны проверить есть ли файлы в сессии(cookie) c tmp_UID, при наличии переместить в постоянное хранилище файлов и прописать в БД.

Для очистки подгруженных и в конченом итоге не востребованных файлов из временной директории - создаем скрипт, который смотрит на дату файла и если файл залежался(зависит от бизнес-логики, у меня это 4 часа), удаляем его.

Плюсы такого подхода:

  1. при обновлении страницы файлы не теряются, а погрузятся в карточку не сохраненного товара
  2. есть возможность удалять, добавлять, изменять файлы до сохранения в БД
  3. в БД меньше мусора

Спасибо за внимание!

А как Вы решили эту проблему?