无法使用 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

https://imgur.com/a/E5ehGuv

您将看到图像页面,但不是图像路径。 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 对原始输出进行不需要的解码。