Если вы передаете бинарные данные файла предварительно скачивая их и помещая в локальную переменную, тогда все верно. Они попадают в тело запроса.
Пример:
$data = ["image" => file_get_contents($URL)];
CURLOPT_POSTFIELDS($curl, $data);
А когда вам нужно передать файл, который находится по локальному адресу, тогда используйте CURLFile
Пример:
$image = [];
$image['path'] = 'path\tmp\file.jpg';
$image['type'] = "image/jpeg";
$image['name'] = "file.jpg";
$data = ["image" => new CURLFile($image['path'], $image['type'], $image['name'])];
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
На стороне обработчика изображение попадает в папку tmp, как после обычной отправки формы с файлом, нужно будет разобрать массив $_FILES