无法使用 PHP CURL 下载远程图像
Unable to download remote image with PHP CURL
编辑:我联系了 scrapestack 的支持并确认他们 api 不支持图像文件。
我正在尝试使用带有 php 的 CURL 下载远程图像。下面是我的代码。但是每当我尝试打开下载的图像时,我总是得到:
Cannot read this file. This is not a valid bitmap file, or its format is not currently supported.
有人知道我的代码有什么问题吗?谢谢。
$image ="http://api.scrapestack.com/scrape?access_key=TOKEN-HERE&url=https://i.imgur.com/Cbiu8Ef.png";
$imageName = pathinfo( $image, PATHINFO_BASENAME );
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $image );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTP_CONTENT_DECODING, false);
$source = curl_exec( $ch );
$info = curl_getinfo($ch);
curl_close( $ch );
file_put_contents( $imageName, $source );
我无法打开文件,当我尝试用 sublime 打开它时,它卡在正在加载图像。当我用记事本打开它时,我得到了以下看起来像 PNG 图像的图像,但它不是有效图像。文件开头为
�PNG
IHDR � q�I� IDATx�k�]�u�o��(��_�M��m�8:���_r�G
您可以在此处查看文件:https://gofile.io/?c=cfsYf2
看起来问题出在通过 Scrapestack 发出 curl 请求,因为如果我将 curl 直接指向图像 url,图像就会正确下载,如下所示:
$image ="https://i.imgur.com/Cbiu8Ef.png";
你的问题是这个url。
$image ="http://api.scrapestack.com/scrape?access_key=TOKEN-HERE&url=https://imgur.com/a/E5ehGuv";
如果你去这个url
您将看到图像页面,但不是图像路径。 pathinfo()
函数在这里不起作用并引发错误。
如果您右键单击该图片并在新标签页中打开图片,您将看到图片路径,在本例中为
https://i.imgur.com/Cbiu8Ef.png
所以你可以试试这个url
$image ="http://api.scrapestack.com/scrape?access_key=TOKEN-HERE&url=https://i.imgur.com/Cbiu8Ef.png";
编辑:我今天多玩了一下 scrapestack,它似乎不支持图像抓取。最好联系他们的客户支持并找出答案。
@Towsif 是对的,您正在尝试获取页面,而不是实际图像。我很快就把东西放在一起了,试试看是否适合你。
$queryString = http_build_query([
'access_key' => 'replace this with your own token',
'url' => 'https://i.imgur.com/Cbiu8Ef.png',
]);
$ch = curl_init(sprintf('%s?%s', 'http://api.scrapestack.com/scrape', $queryString));
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
$image_source = curl_exec( $ch );
curl_close( $ch );
file_put_contents( 'Cbiu8Ef.png' , $image_source );
看起来您得到的响应是一个损坏的 PNG 图像。
如果您使用 PHP 5.1.3之前的版本,您需要为二进制数据传输指定一个附加选项,例如图像:
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
如果以上选项不能解决问题,您可以尝试设置
curl_setopt($ch, CURLOPT_HTTP_CONTENT_DECODING, false);
如果响应有 Content-Type
header 设置错误,让 curl 对原始输出进行不需要的解码。
编辑:我联系了 scrapestack 的支持并确认他们 api 不支持图像文件。
我正在尝试使用带有 php 的 CURL 下载远程图像。下面是我的代码。但是每当我尝试打开下载的图像时,我总是得到:
Cannot read this file. This is not a valid bitmap file, or its format is not currently supported.
有人知道我的代码有什么问题吗?谢谢。
$image ="http://api.scrapestack.com/scrape?access_key=TOKEN-HERE&url=https://i.imgur.com/Cbiu8Ef.png";
$imageName = pathinfo( $image, PATHINFO_BASENAME );
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $image );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTP_CONTENT_DECODING, false);
$source = curl_exec( $ch );
$info = curl_getinfo($ch);
curl_close( $ch );
file_put_contents( $imageName, $source );
我无法打开文件,当我尝试用 sublime 打开它时,它卡在正在加载图像。当我用记事本打开它时,我得到了以下看起来像 PNG 图像的图像,但它不是有效图像。文件开头为 �PNG
IHDR � q�I� IDATx�k�]�u�o��(��_�M��m�8:���_r�G
您可以在此处查看文件:https://gofile.io/?c=cfsYf2
看起来问题出在通过 Scrapestack 发出 curl 请求,因为如果我将 curl 直接指向图像 url,图像就会正确下载,如下所示:
$image ="https://i.imgur.com/Cbiu8Ef.png";
你的问题是这个url。
$image ="http://api.scrapestack.com/scrape?access_key=TOKEN-HERE&url=https://imgur.com/a/E5ehGuv";
如果你去这个url
您将看到图像页面,但不是图像路径。 pathinfo()
函数在这里不起作用并引发错误。
如果您右键单击该图片并在新标签页中打开图片,您将看到图片路径,在本例中为
https://i.imgur.com/Cbiu8Ef.png
所以你可以试试这个url
$image ="http://api.scrapestack.com/scrape?access_key=TOKEN-HERE&url=https://i.imgur.com/Cbiu8Ef.png";
编辑:我今天多玩了一下 scrapestack,它似乎不支持图像抓取。最好联系他们的客户支持并找出答案。
@Towsif 是对的,您正在尝试获取页面,而不是实际图像。我很快就把东西放在一起了,试试看是否适合你。
$queryString = http_build_query([
'access_key' => 'replace this with your own token',
'url' => 'https://i.imgur.com/Cbiu8Ef.png',
]);
$ch = curl_init(sprintf('%s?%s', 'http://api.scrapestack.com/scrape', $queryString));
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
$image_source = curl_exec( $ch );
curl_close( $ch );
file_put_contents( 'Cbiu8Ef.png' , $image_source );
看起来您得到的响应是一个损坏的 PNG 图像。
如果您使用 PHP 5.1.3之前的版本,您需要为二进制数据传输指定一个附加选项,例如图像:
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
如果以上选项不能解决问题,您可以尝试设置
curl_setopt($ch, CURLOPT_HTTP_CONTENT_DECODING, false);
如果响应有 Content-Type
header 设置错误,让 curl 对原始输出进行不需要的解码。