Сохранить изображение из URL с помощью curl и file_put_contents Stack Overflow

Я хочу сохранить изображение с удаленного сервера на моем сайте.
Я создаю текст в редакторе TinyMCE и вставляю туда изображение с удаленного сервера. Далее мне нужно сохранить эту картинку на моем сервере.
Для этого я получаю ссылку на картинку из текста:

    preg_match('/<img(.*)src(.*)=(.*)"(.*)"/U', $text, $result);
$url =  array_pop($result);

Далее через curl и file_put_contents я получаю файл и копирую на мой сервер.

    $headers = array();
$headers[] = 'Content-Type: image/jpeg';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,  $url ) ;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01;
Windows NT 5.0)");
$image = curl_exec($ch);
curl_close($ch);

file_put_contents('myfolder/image.jpg', $url);

В результате создается не картинка, а текстовый файл «myfolder / image.jpg» размером 16 КБ с текстом — неверная временная метка URL.

curl_getinfo returns [content_type] => text/plain [http_code] => 403

Но в случае, если я назначаю $url вручную в CURLOPT_URL, например

$url = 'https://scontent.ftbs4-1.fna.fbcdn.net/v/t1.0-9/39900479_1856467244440953_5986986678919626752_n.jpg?_nc_cat=0&oh=6262ebe636e7328f0471af2820fd4050&oe=5C03BEC7'

тогда файл успешно скопирован.

curl_getinfo returns [content_type] => image/jpeg [http_code] => 200

Где я сделал не так?

это $_POST:

Array (
[id] => 143
[title] => Topic
[description] => description
[text] => <!DOCTYPE html> <html> <head> </head> <body> <p>Hello</p> <p><img src="https://scontent.ftbs4-1.fna.fbcdn.net/v/t1.0-9/39900479_1856467244440953_5986986678919626752_n.jpg?_nc_cat=0&amp;oh=6262ebe636e7328f0471af2820fd4050&amp;oe=5C03BEC7" alt="" width="776" height="776" /></p> </body> </html>
)

полный код php

<?php
//print_r($_POST);

preg_match_all('/<img[^>]+>/i',$_POST['text'] , $result);

foreach($result  as $img_tag){
foreach( $img_tag as $tag){
preg_match('/<img(.*)src(.*)=(.*)"(.*)"/U', $tag, $regexResult);
$img_link = array_pop($regexResult);
$file_name = basename($img_link);

//$img_link = 'https://scontent.ftbs4-1.fna.fbcdn.net/v/t1.0-9/39900479_1856467244440953_5986986678919626752_n.jpg?_nc_cat=0&oh=6262ebe636e7328f0471af2820fd4050&oe=5C03BEC7';

$headers = array();
$headers[] = 'Content-Type: image/jpeg';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,  $img_link ) ;
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
$html = curl_exec($ch);
curl_close($ch);

$targetPath = '/folder/'.$_POST['id'].'/';

file_put_contents($targetPath.$file_name, $html);
}}
?>

1

Решение

В вашем $_POST содержание img src приходит с определенными специальными символами, такими как & закодировано как &amp;,

Если вы откроете этот URL в браузере, вы получите ту же ошибку: https://scontent.ftbs4-1.fna.fbcdn.net/v/t1.0-9/39900479_1856467244440953_5986986678919626752_n.jpg?_nc_cat=0&amp;oh=6262ebe636e7328f0471af2820fd4050&amp;oe=5C03BEC7,

Вы можете отменить это, используя html_entity_decode. Если я изменю эту строку, завиток сработает:

$img_link = html_entity_decode(array_pop($regexResult));
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]