У нас это было реализовано через JS. Загружали файлы, хранили их в base64, редактировали и так-же на сервер передавали в виде списка текстовых hidden полей, рядом с превьюшками картинок..
При этом, всегда можно было удалить ненужную превьюшку и ее инпут с картинкой в base64