На 5.6 работает вот так.
Пример для загрузки в диалог:
(важно, смотрите в документации, в диалог фото грузится в поле photo, в другие места может грузиться в поле file).
$photo = 'file.png';
$postparam=array("photo"=>"@".$photo);
$ch = curl_init($request_server->response->upload_url);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postparam);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; charset=UTF-8'));
$upload = json_decode(curl_exec($ch));
curl_close($ch);
Для php7 используется CURLFile и CURL без параметра CURLOPT_SAFE_UPLOAD
"photo"=> new CURLFile($photo)