使用 curl 和 file_put_contents PHP 保存来自 url 的图像
Save image from url with curl and file_put_contents PHP
我想将图片从远程服务器保存到我的站点。
我在 TinyMCE 编辑器中创建文本并从那里插入远程服务器的图像。接下来,我需要将这张图片保存到我的服务器。
为此,我从文本中得到一个 link 到图片:
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 kb,带有文本 - 错误 URL 时间戳。
curl_getinfo returns [content_type] => text/plain [http_code] => 403
但是,如果我在 CURLOPT_URL
中手动分配 $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&oh=6262ebe636e7328f0471af2820fd4050&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);
}}
?>
在您的 $_POST
中,img src
的内容带有某些特殊字符,例如 &
编码为 &
。
如果你在浏览器中打开这个URL,你会得到同样的错误:https://scontent.ftbs4-1.fna.fbcdn.net/v/t1.0-9/39900479_1856467244440953_5986986678919626752_n.jpg?_nc_cat=0&oh=6262ebe636e7328f0471af2820fd4050&oe=5C03BEC7
。
您可以使用 html_entity_decode
反转转义。如果我更改此行,则卷曲有效:
$img_link = html_entity_decode(array_pop($regexResult));
我想将图片从远程服务器保存到我的站点。 我在 TinyMCE 编辑器中创建文本并从那里插入远程服务器的图像。接下来,我需要将这张图片保存到我的服务器。 为此,我从文本中得到一个 link 到图片:
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 kb,带有文本 - 错误 URL 时间戳。
curl_getinfo returns [content_type] => text/plain [http_code] => 403
但是,如果我在 CURLOPT_URL
中手动分配 $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&oh=6262ebe636e7328f0471af2820fd4050&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);
}}
?>
在您的 $_POST
中,img src
的内容带有某些特殊字符,例如 &
编码为 &
。
如果你在浏览器中打开这个URL,你会得到同样的错误:https://scontent.ftbs4-1.fna.fbcdn.net/v/t1.0-9/39900479_1856467244440953_5986986678919626752_n.jpg?_nc_cat=0&oh=6262ebe636e7328f0471af2820fd4050&oe=5C03BEC7
。
您可以使用 html_entity_decode
反转转义。如果我更改此行,则卷曲有效:
$img_link = html_entity_decode(array_pop($regexResult));