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


Saving images from sources without a specific mime type

举个例子,假设我正在尝试从Google Play商店下载应用程序图标以获得服务。以下是一个示例URL:

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

我为自己开发了一个小型CMS,但也面临同样的问题。经过多次尝试,我找到了解决方案。它对我很有用,我希望你也能发现它对你的项目有用。

关于文件的损坏,对于Chrome用户代理,谷歌服务器以.web格式发送图标,您需要一个PHP库来处理这种类型的图像。对于其他用户代理(如Firefox),图像以PNG格式发送。

现在比较Firefox或Chrome中同一图标的两个URL,您会注意到为Chrome生成的图像路径末尾包含-rw,而Firefox中的同一URL不包含-rw

不需要深入挖掘,只需从URL末尾删除-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。为了精确起见,您可以使用任何其他方法来修复路径的该部分。

附言:您也可以尝试发送一个带有CURL请求的自定义用户代理(即Firefox)来接收PNG路径,这样您就不需要自己修复了:)

您可以使用HttpResponse::getContentType来确定您从URL 获得的内容类型

这不是png,而是WebP

你可以在带有的PHP中使用它

imagecreatefromwebp( string $filename );

更多信息:-https://developers.google.com/speed/webp/-http://php.net/manual/function.imagecreatefromwebp.php