Описание проблемы.
Возьмем простую форму карточки товара, у которой имеются стандартные поля, и поле изображения (а может и не сколько таких полей)
Заказчик видит форму и говорит: "Хочу чтобы при выборе картинок сразу появлялись preview и их можно было удалять/заменять".
Надо так надо.
Когда товар уже сохранен в БД проблем не возникает, вешаем событие на onchange поля выбора файлов и отправляем их на сервер (ajax), привязываем к текущему товару, генерируем preview и отдаем в ответ на ajax запрос.
Но как поступить если вы только начали создавать товар, и записи в БД о нем еще нет?!
вариант первый:
При отправке изображения на сервер передавать UID товара, если товар новый то создать пустую запись, получить ее UID и вернуть его вместе с preview изображения.
Вариант рабочий, но что если товар начали заполнять, загрузили картинку, а из-за стенки довольный Игорь кричит: "Ура! Я добавил этот товар!!!". Удалять товар? (что не есть хорошо, в 99% систем товары не удаляются а лишь добавляется признак что он удален, в итоге БД растет как PHP слон)
вариант два(все гениальное просто):
Вовсе запретить загрузку файлов до создания товара. Вариант рабочий, но срок годности истек еще в ~2014 году.
вариант три: (или то как делаю я):
При создании нового товара необходимо создать ссылку с произвольным несуществующим tmp_UID.
Выбираем файлы, отправляем на сервер (ajax), генерируем preview (если требуется), далее нам необходимо поставить cookie или открыть сессию, в которой мы пропишем key =tmp_UID, а в качестве значений - массив загруженных файлов.
При сохранении товара мы должны проверить есть ли файлы в сессии(cookie) c tmp_UID, при наличии переместить в постоянное хранилище файлов и прописать в БД.
Для очистки подгруженных и в конченом итоге не востребованных файлов из временной директории - создаем скрипт, который смотрит на дату файла и если файл залежался(зависит от бизнес-логики, у меня это 4 часа), удаляем его.
Плюсы такого подхода:
- при обновлении страницы файлы не теряются, а погрузятся в карточку не сохраненного товара
- есть возможность удалять, добавлять, изменять файлы до сохранения в БД
- в БД меньше мусора
Спасибо за внимание!
А как Вы решили эту проблему?