Если есть опыт использования именно фреймворка, то изучить другой будет проще, особенно когда перед глазами пример, как его правильно готовить в конкретном месте.
Норм конторы требуют symfony, кто победнее, вынуждены искать тех, кто умеет любой фреймворк сходной архитектуры.
Рест - это вообще соглашение о принципах работы апи.
А так что, берешь у сервера уникальный ид для загрузки в ответ на количество частей контента, посылаешь все части, как сервер их получил - он сам файл и склеил.
Или вообще файл в целом виде в фоне паковать в многотомный архив.
если работа с файлами организована правильно - то кто-то один немного подождет, пока запишет другой.
если все совсем печально - то сработает принцип "кто последний - тот и папа".
Самый хороший способ - добавить внешний ключ с роя id на поле parent_id и свойством cascade в on delete.
Ну, или в цикле, без рекурсии, у тебя есть id, получаешь всех id, у кого он parent_id, ищешь по ним тем же способом. Когда набор пустой - останавливаешь цикл.