无法使用PHP CURL下载远程映像

无法使用PHP CURL下载远程映像,php,curl,php-curl,Php,Curl,Php Curl,编辑:我联系了scrapestack的支持人员,确认他们的api不支持图像文件 我正在尝试使用CURL和php下载一个远程图像。下面是我的代码。但每当我尝试打开下载的图像时,我总是会得到: Cannot read this file. This is not a valid bitmap file, or its format is not currently supported. 有人知道我的代码有什么问题吗?多谢各位 $image ="http://api.scrapestack.com/

编辑:我联系了scrapestack的支持人员,确认他们的api不支持图像文件

我正在尝试使用CURL和php下载一个远程图像。下面是我的代码。但每当我尝试打开下载的图像时,我总是会得到:

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的图像,但是它不是一个有效的图像。文件以开头 �巴布亚新几内亚

IHDR       �   q�I�    IDATx�k�]�u�o��(��_�M��m�8:���_r�G
您可以在此处看到该文件:

看起来问题在于通过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

您将看到图像页面,但不会看到图像路径<代码>路径信息()函数在此处不起作用,并引发错误

如果右键单击该图像并在“新建”选项卡中打开图像,您将看到图像路径,在本例中为

因此,您可以尝试使用此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图像

如果您在5.1.3版之前使用PHP,则需要为二进制数据传输指定一个附加选项,如图像:

curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);

如果上述选项无法解决问题,您可以尝试设置

curl_setopt($ch, CURLOPT_HTTP_CONTENT_DECODING, false);

如果响应的
内容类型
标题设置错误,则会对原始输出进行不必要的解码。

如果使用文本编辑器打开下载的文件,会得到什么?如果是可读文本,请编辑您的问题并发布文本。@Paolo,文件太大了,我不认为在这里发布全部内容是个好主意,所以我将其上传到了网上。请看一看,如果你可以看起来像一个腐败的png图像,请看我的回答谢谢你指出这一点。我抄错了行。在我的php文件中,我使用的是图像url,而不是页面url。如果对你有效,那么请接受答案。谢谢你的帮助。我尝试了你的代码,但它生成的文件与我的文件相同,这不是有效的图像文件。@Paolo,我没有足够的声誉给你的答案添加注释,所以我将在这里添加它。我不认为二进制传输是个问题,今天早上我花了一些时间来处理代码,我相信问题在于请求是由谁发出的。如果我使用上面的代码并直接转到图像url,我可以很好地下载图像。卢克·马克,照保罗的建议去做,试试也无妨,也许我错了,你是对的,知道为什么会这样吗?我搞不懂why@LukeMark我编辑了我的答案。请参阅更新。顺便说一句:如果你将curl指向图像
https://i.imgur.com/Cbiu8Ef.png
除了scrapestack之外,您还获得损坏的图像或有效的PNG吗?如果您获得了一个有效的映像,那么scrapestack就会出现问题。如果您在这两种情况下都得到了无效的映像,那么您的环境中就有问题了——但是您发布的代码是正确的。希望有帮助。我尝试了你上面建议的两种代码。还是一样的错误。如果我将旋度直接指向图像,它会起作用。但如果我试图通过scrapestack获得它,它就不起作用了。@LukeMark似乎是scrapestack的问题。如果scrapestack提供的是错误的数据,那么除了打开一张支持票/提交一份错误报告之外,你没什么可做的。我做了,并确认他们不支持图像文件。