Правильнее было бы прочитать файл в строку и затем предоставить эту строку для параметров CURLOPT_POSTFIELDS. Эта функция чтения в строку не предоставляется libcurl, но выполняется клиентом командной строки, и я не думаю, что привязка PHP / CURL предлагает эквивалент.
В командной строке используется --data-binary, которая соответствует CURLOPT_POSTSFIELDS со строкой, а не хеш-массиву, поскольку массив превратит сообщение в составное сообщение (что командная строка делает с -F, --form ). Кроме того, пользовательский запрос, установленный на POST, является излишним.
Обычно запуск командной строки с "--libcurl test.c" - это хороший способ получить первый черновой вариант программы на C, использующий C API, но, поскольку PHP API очень похож, он должен работать достойно начать в большинстве случаев.
Редактировать: и пользовательское изменение / предоставление заголовка «Content-Length:» никогда не будет хорошей идеей, если вы не очень хорошо знаете, что делаете. libcurl всегда будет предоставлять тот, который генерируется на основе данных, которые вы ему передаете.