如何让HybridAuth返回的Reddit头像URL可被imagecreatefrompng正常调用
问题复现
- 使用OAuth库:hybridauth-3.7.1
- 业务代码:
<?php require_once 'hybridauth-3.7.1/vendor/autoload.php'; $config = [ 'callback' => 'my_callback_url', 'keys' => [ 'id' => 'my_app_id', 'secret' => 'my_secret' ], ]; $adapter = new Hybridauth\Provider\Reddit( $config ); $adapter->authenticate(); $userProfile = $adapter->getUserProfile(); $photo = $userProfile->photoURL;
- 异常现象:
- 直接
echo $photo输出的URL正常,手动传入imagecreatefrompng可正常执行 - 直接把
$photo变量传入imagecreatefrompng($photo)调用失败,错误日志如下:
- 直接
imagecreatefrompng( https://styles.redditmedia.com/t5_55fo22/styles/profileIcon_bblqmk8klas71.png?width=256&amp;height=256&amp;crop=256:256,smart&amp;s=30a3bb6af945eadeaddb40271d2c0161ca82768d ): failed
- 使用
urldecode处理URL后问题依旧。
原因说明
该问题是HTML实体多次转义导致的,并非URL编码问题:URL中的&被转义为HTML实体&,且触发了多次转义最终变成&amp;,urldecode是用来处理URL百分号编码的,对HTML实体转义无效。
解决方法
使用PHP内置的htmlspecialchars_decode()函数对URL做HTML实体解码即可,示例代码:
$photo = htmlspecialchars_decode($userProfile->photoURL); $img = imagecreatefrompng($photo);
如果存在多次转义的情况,可以连续调用两次解码函数:
$photo = htmlspecialchars_decode(htmlspecialchars_decode($userProfile->photoURL));
兼容优化方案
如果你的服务器未开启allow_url_fopen配置,就算URL正确也会调用失败,可通过cURL先拉取图片内容再创建图片资源,兼容性更强:
// 解码URL $photo = htmlspecialchars_decode($userProfile->photoURL); // 发起请求拉取图片内容 $ch = curl_init($photo); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); $imgContent = curl_exec($ch); curl_close($ch); // 从内容直接创建图片资源 $img = imagecreatefromstring($imgContent);
内容的提问来源于stack exchange,提问作者Bruce
相关产品推荐
相关产品推荐

