从没有特定mime类型的源保存图像

时间:2015-12-16 07:03:19

标签: php

例如,假设我正在尝试从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变量没有任何问题。我尝试通过网络浏览器手动将图像保存到文件中,同样的问题出现了。

3 个答案:

答案 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