Вот примитивный, не для CI но зато понятный, без загрузки на сервер никак не обойтись, но делается это по другому, мы просто загружаем во временную папку и сразу же из нее отдаем.
if (isset($_FILES)){
foreach ($_FILES['uploadfile']['name'] as $k=>$v){
if($_FILES['uploadfile']['type'][$k] == "image/gif" || $_FILES['uploadfile']['type'][$k] == "image/png" || $_FILES['uploadfile']['type'][$k] == "image/jpg" || $_FILES['uploadfile']['type'][$k] == "image/jpeg"){
$blacklist = array(".php", ".phtml", ".php3", ".php4");
foreach ($blacklist as $item){
if(preg_match("/$item\$/i", $_FILES['uploadfile']['name'][$k])){
echo "Нельзя загружать скрипты.";
exit;
}
}
# сюда загружается файл на основном сервере
$file = $_FILES['uploadfile']['tmp_name'][$k];
# адрес сервера
$url = 'http://s1.site.ru/upload.php';
$post = [
'image'=> new CURLFile($file, mime_content_type($file), date('YmdHis').rand(100,1000)),
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
}
}
}