Мне нужно сохранить изображение с URL-адреса, используя CURL, и сохранить его в папке на моем сервере. Я сражался с этим кодом безрезультатно. В идеале я хотел бы захватить изображение и сохранить его как «photo1» или что-то еще. Помогите!
function GetImageFromUrl($link) { $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch,CURLOPT_URL,$link); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result=curl_exec($ch); curl_close($ch); return $result; } $sourcecode = GetImageFromUrl($iticon); $savefile = fopen(' /img/uploads/' . $iconfilename, 'w'); fwrite($savefile, $sourcecode); fclose($savefile);
попробуй это:
function grab_image($url,$saveto){ $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); $raw=curl_exec($ch); curl_close ($ch); if(file_exists($saveto)){ unlink($saveto); } $fp = fopen($saveto,'x'); fwrite($fp, $raw); fclose($fp); }
,function grab_image($url,$saveto){ $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); $raw=curl_exec($ch); curl_close ($ch); if(file_exists($saveto)){ unlink($saveto); } $fp = fopen($saveto,'x'); fwrite($fp, $raw); fclose($fp); }
,function grab_image($url,$saveto){ $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); $raw=curl_exec($ch); curl_close ($ch); if(file_exists($saveto)){ unlink($saveto); } $fp = fopen($saveto,'x'); fwrite($fp, $raw); fclose($fp); }
и убедитесь, что в php.ini allow_url_fopen включен
Опция 1
Вместо того, чтобы выбирать двоичные / необработанные данные в переменную, а затем писать, вы можете использовать параметр CURLOPT_FILE
чтобы напрямую показывать файл на завиток для загрузки.
Вот функция:
// takes URL of image and Path for the image as parameter function download_image1($image_url, $image_file){ $fp = fopen ($image_file, 'w+'); // open file handle $ch = curl_init($image_url); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // enable if you want curl_setopt($ch, CURLOPT_FILE, $fp); // output to file curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 1000); // some large value to allow curl to run for a long time curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); // curl_setopt($ch, CURLOPT_VERBOSE, true); // Enable this line to see debug prints curl_exec($ch); curl_close($ch); // closing curl handle fclose($fp); // closing file handle }
И вот как вы должны это назвать:
// test the download function download_image1("http://www.gravatar.com/avatar/10773ae6687b55736e171c038b4228d2", "local_image1.jpg");
Вариант №2
Теперь, если вы хотите загрузить очень большой файл , этот случай выше функции может оказаться непригодным. На этот раз вы можете использовать приведенную ниже функцию для обработки большого файла. Кроме того, вы можете распечатать прогресс (в %
или в любом другом формате), если хотите. Ниже функция реализована с помощью функции callback
которая записывает фрагмент данных в файл в процесс загрузки.
// takes URL of image and Path for the image as parameter function download_image2($image_url){ $ch = curl_init($image_url); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // enable if you want curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 1000); // some large value to allow curl to run for a long time curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); curl_setopt($ch, CURLOPT_WRITEFUNCTION, "curl_callback"); // curl_setopt($ch, CURLOPT_VERBOSE, true); // Enable this line to see debug prints curl_exec($ch); curl_close($ch); // closing curl handle } /** callback function for curl */ function curl_callback($ch, $bytes){ global $fp; $len = fwrite($fp, $bytes); // if you want, you can use any progress printing here return $len; }
И вот как вызвать эту функцию:
// test the download function $image_file = "local_image2.jpg"; $fp = fopen ($image_file, 'w+'); // open file handle download_image2("http://www.gravatar.com/avatar/10773ae6687b55736e171c038b4228d2"); fclose($fp); // closing file handle
Улучшенная версия ответа Komang (добавьте референт и пользовательский агент, проверьте, можете ли вы записать файл), верните true, если это нормально, false, если есть ошибка:
public function downloadImage($url,$filename){ if(file_exists($filename)){ @unlink($filename); } $fp = fopen($filename,'w'); if($fp){ $ch = curl_init ($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); $result = parse_url($url); curl_setopt($ch, CURLOPT_REFERER, $result['scheme'].'://'.$result['host']); curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'); $raw=curl_exec($ch); curl_close ($ch); if($raw){ fwrite($fp, $raw); } fclose($fp); if(!$raw){ @unlink($filename); return false; } return true; } return false; }
Это самый простой инструмент.
function downloadFile($url, $path) { $newfname = $path; $file = fopen($url, 'rb'); if ($file) { $newf = fopen($newfname, 'wb'); if ($newf) { while (!feof($file)) { fwrite($newf, fread($file, 1024 * 8), 1024 * 8); } } } if ($file) { fclose($file); } if ($newf) { fclose($newf); } }