PHP输出图片到网页的关键是正确设置Content-Type头且输出前无任何字符:必须匹配实际格式(如image/png),禁用BOM和空白,GD生成时header需与函数名一致,readfile()不推荐,file_get_contents()+echo更可控。
PHP 输出图片到网页,关键不是“显示”,而是让浏览器正确识别响应体为图片内容——这完全取决于 header() 设置是否匹配图片实际格式。错配或缺失会导致乱码、下载弹窗、空白页等现象。
浏览器靠这个判断响应内容类型,PHP 不会自动推断。漏设或写错就会出问题:
image/jpeg 对应 .jpg / .jpeg
image/png 对应 .png
image/gif
对应 .gif
image/webp 对应 .webp(需 PHP 7.1+ 且 GD 支持)错误示例:header('Content-Type: image/jpg'); —— jpg 不是标准 MIME 类型,应为 jpeg。
一旦有任意字符(哪怕一个空格、UTF-8 BOM 或 echo '')在 header() 前发出,PHP 就会报 Warning: Cannot modify header information,图片无法正常显示。
实操建议:
开头,前面**绝对无空行、空格、BOM 字节**
include 或 require 的文件中存在输出headers_sent($file, $line) 定位输出源头不推荐用 readfile() 简单代理(易受路径/权限干扰),更可控的是用 file_get_contents() + echo,或 GD 函数动态生成:
注意:Content-Length 非必需,但加上有助于浏览器预判加载进度;exit 必须加,防止后续代码意外输出。
用 imagejpeg()、imagepng() 等函数时,header 必须在调用前设置,且类型必须与函数名一致:
imagejpeg($img) → header 必须是 image/jpeg
imagepng($img) → header 必须是 image/png
imagejpeg($img, null, 90) 输出到内存,则不能传文件路径,否则 header 无效常见错误:imagejpeg($img, 'out.jpg') 会把图片写入文件,而不是输出给浏览器——此时 header 毫无作用。
最易被忽略的是:不同服务器(如 Nginx + PHP-FPM)对输出缓冲的处理差异更大,本地测试正常,上线后白屏,大概率是某处静默输出或 BOM 导致 header 失效。