CURL POST запит, складовийвміст (multipart

запит
Дуже часто постає питання надсилання запиту POST на віддалений сервер. Давайте детально розглянемо, як це зробити за допомогою бібліотеки CURL. Найпростіший варіант - емуляція відправки INPUT полів форми. Допустимо є якась форма:

Тоді наш код, що емулює відправлення даних, буде наступним:

А що робити якщо нам потрібно надіслати не лише текст із форми, а й відправити файл? Для цього в комірку масиву заносимо шлях до файлу, який потрібно відправити і перед ним ставимо знак @. Даний знак є директивою для CURL, що це шлях до файлу і, відповідно, передати його на заданий ресурс. Наш код перетвориться на такий вигляд:

Все начебто добре, але біда, ми формуємо самі цей файл у пам'яті, або ж отримуємо його звідкись. В цьому випадку не завжди зручно зберігати файл на диск, щоб CURL відправив його POST запитом на віддалений ресурс. Як бути тоді? Для вирішення цього завдання формуватимемо запит «вручну» формуючи тіло і заголовок самі.

Для зручності напишемо спочатку клас-контейнер, в якому буде вміст файлу та його параметри:

Цей клас необхідний, щоб у масиві для POST запиту, можна було ідентифікувати елементи містять файл. Потім напишемо універсальний клас, що формує multipart/form-data слідуючи RFC7478:

Цей клас обробить масив з елементами форми, і якщо зустрінеться серед елементів масиву клас — oFile, він сформує тіло POST запиту з урахуванням вимог «multipart/form-data» для складового типу вмісту.

Тепер наша програма виглядатиме так:

Ось так можна виконати наше завдання, пройшовши зайву ланку збереження на диск. Цим ми заощадимо пам'ять, час та ресурси.