例如,假设我正在尝试从Google Play商店下载应用程序图标以获取服务。以下是一个示例网址:
https://lh6.ggpht.com/1eVPA6Iukw-F4i5xq1ZWicaKBzmprLGw98YhdG20E-wlsHHg3PcKJqbY_fWLdJeGRw=w512-rw
没有与提供的数据相关联的mime类型,并且当文件被保存时,任何图像查看者(或者至少是我尝试过的那些)都会说文件已损坏。它们将出现在Chrome和其他一些东西中,但在检查数据时,很明显没有mime类型。这是一个问题,因为我在其他脚本中进一步使用这些数据流,这些脚本要求将它们识别为特定类型。 (即PNG)
我尝试过这样的事情:
imagepng(imagecreatefromstring($icondata), $finaldir.'/icon.png');
$ icondata只是图像的卷曲响应。这将返回一个错误,指出数据是imagecreatefromstring函数的未知格式。当然,我也尝试过:
file_put_contents($finaldir.'/icon.png', $icondata);
无济于事。它创建了文件,但正如我所说,在大多数应用程序和各种分析功能中,图像不会被识别为图像。有没有办法专门设置给定数据字符串的mime类型?或者其他一些我没有看到的解决方法?
编辑:另外,要注意,$ icondata变量没有任何问题。我尝试通过网络浏览器手动将图像保存到文件中,同样的问题出现了。
答案 0 :(得分:3)
我为自己开发了一个小型CMS,面临同样的问题。经过多次尝试,我找到了解决方案。它对我有用,我希望你会发现它对你的项目也很有用。
关于文件损坏,对于Chrome用户代理,Google服务器会将图标发送为.webp格式,您需要一个PHP库来处理此类图像。对于其他用户代理(如Firefox),图像以PNG格式发送。
现在比较Firefox或Chrome中相同图标的两个网址,您会注意到Chrome生成的图片路径最后包含-rw
,而Firefox中的相同网址不包含-rw
}。
不深入挖掘,只需从网址末尾删除-rw
并复制图片即可。您将获得PNG图像。这里有一个提示:
<?php
$image_path = "https://lh5.ggpht.com/8PODwBXKk4L201m4IO1wifRDfbn4Q1JxNxOzj-5TXPJ85_S-vOqntLi7TsVyeFQM0w4=w300-rw"; // Firefox app on Google Play
$png_path = substr($image_path, 0, -3);
copy($png_path, 'file.png');
?>
这会将图像保存为PNG。请注意,我已使用substr()
功能从结尾删除-rw
。为了使其精确,您可以使用任何其他方式来修复路径的这一部分。
P.S。您也可以尝试使用CURL请求发送自定义用户代理(即Firefox)以接收PNG路径,这样您就不需要自己修复它了:)
答案 1 :(得分:0)
您可以使用HttpResponse :: getContentType来确定您从网址获取的内容类型
答案 2 :(得分:0)
这不是png,而是WebP
您可以在PHP中使用
imagecreatefromwebp( string $filename );
更多信息: - https://developers.google.com/speed/webp/ - http://php.net/manual/function.imagecreatefromwebp.php