Вы зачем-то передаете во ВК закодированный адрес изображения. Но должны вы передавать сам файл. Вы должны загрузить изображение на сервер, а затем переписать строчку
curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => $image_url));
так, если у вас PHP меньше 5.5:
curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => '@path/to/image.jpg'));
или если PHP больше или равен 5.5:
curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => new CURLFile('path/to/image.jpg')));
Эту строку можно удалить:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data; charset=UTF-8'));
Также используйте для обращения к API домен
api.vk.com и не забывайте в своих запросах передавать версию API в параметре
v.
UPD: также, как подметили ранее, для загрузки фотографий на стену вы должны передавать фотографии в поле
photo, а не file{...}.