如何通过PHP GET请求正确显示GIF验证码图片?解决编码乱码问题
解决验证码图片输出乱码的问题
你看到乱码的核心原因是:浏览器默认将输出内容解析为纯文本,但你实际输出的是GIF图片的二进制数据。你的代码只在请求目标服务器时设置了请求头,却没有给当前PHP脚本的响应设置正确的HTTP头,告诉浏览器这是一张图片。
另外你的请求头还有个小问题:多个HTTP头字段之间需要用\r\n分隔,否则目标服务器可能无法正确解析你的请求头。
修改后的代码:
<?php // 先设置响应头,告诉浏览器这是GIF图片 header('Content-Type: image/gif'); // 修正请求头格式:多个头用\r\n分隔,GET请求不需要Content-type(可选移除) $opts = array( 'http' => array( 'method' => "GET", 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0\r\n" ) ); $context = stream_context_create($opts); $url = "http://api.solvemedia.com/papi/media?c=2@o-mubMTi7BBM98cMxgtIcLP4k1Ga5QJl@XmSqPdjlX-EENU8bgrS8i39APTC4lJjob8CffjsxV9jrIPX3GtuHidRkFAj1t048X4InDBGooKrfHCJw-UPc3RJpBQsHb2I4Ug4VdDwqVA6LkWJh3SQOW.xtxmxeN9pNZ1mEbLs-u3qV.Yggw0lLbut2o9pohrFf1j5Fdnw9hpKzSHxwwUck66zMZZv2-NaZh-D.wUNr5e6dWFspNlf-cGlixcH0GFCAtKyRSgVedyp15hlmTgWmuzlcfHwctVjdNqQUiVaxLDqzNsw71YyJ.aFCS7qjn4ZyJkhFXIK0uoAv0iP9---rdedIcIWDMcOAiIpU.IBN8Fs"; $image = file_get_contents($url, false, $context); echo $image; ?>
额外优化:动态适配图片类型
如果不确定目标返回的图片是GIF/PNG/JPG,可以通过二进制内容判断图片类型,再设置对应的响应头,兼容性更好:
<?php $opts = array( 'http' => array( 'method' => "GET", 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:51.0) Gecko/20100101 Firefox/51.0\r\n" ) ); $context = stream_context_create($opts); $url = "http://api.solvemedia.com/papi/media?c=2@o-mubMTi7BBM98cMxgtIcLP4k1Ga5QJl@XmSqPdjlX-EENU8bgrS8i39APTC4lJjob8CffjsxV9jrIPX3GtuHidRkFAj1t048X4InDBGooKrfHCJw-UPc3RJpBQsHb2I4Ug4VdDwqVA6LkWJh3SQOW.xtxmxeN9pNZ1mEbLs-u3qV.Yggw0lLbut2o9pohrFf1j5Fdnw9hpKzSHxwwUck66zMZZv2-NaZh-D.wUNr5e6dWFspNlf-cGlixcH0GFCAtKyRSgVedyp15hlmTgWmuzlcfHwctVjdNqQUiVaxLDqzNsw71YyJ.aFCS7qjn4ZyJkhFXIK0uoAv0iP9---rdedIcIWDMcOAiIpU.IBN8Fs"; $image = file_get_contents($url, false, $context); // 获取图片信息 $imageInfo = getimagesizefromstring($image); if ($imageInfo) { // 设置对应响应头 header("Content-Type: {$imageInfo['mime']}"); echo $image; } else { echo "无法获取有效图片"; } ?>
内容的提问来源于stack exchange,提问作者waylan
相关产品推荐
相关产品推荐

