如何用PHP判断图片URL返回的是有效图片还是无效XML?
检查Azure Blob图片URL有效性的PHP解决方案
针对你遇到的问题——部分Azure Blob URL返回XML而非有效图片,导致FPDF生成PDF时触发致命错误,可以通过以下步骤提前验证URL有效性:
1. 优先检查HTTP响应头的Content-Type
有效图片的响应头Content-Type会是image/jpeg、image/png等图片类型,而无效XML的响应头通常为application/xml或text/xml。通过curl获取响应头可以快速过滤大部分无效链接:
function isValidImageUrl($url) { // 第一步:检查响应头Content-Type $ch = curl_init($url); curl_setopt($ch, CURLOPT_NOBODY, true); // 只请求头,不获取内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 处理重定向 curl_exec($ch); $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); curl_close($ch); $validImageTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp']; if (!in_array($contentType, $validImageTypes)) { return false; }
2. 验证返回内容是否为XML
部分场景下可能存在Content-Type标注错误的情况,因此需要进一步检查返回内容是否以XML声明开头:
// 第二步:获取内容并检查是否为XML $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $imageData = curl_exec($ch); curl_close($ch); if ($imageData === false || str_starts_with(trim($imageData), '<?xml')) { return false; }
3. 最终验证图片有效性
最后通过getimagesize确认内容为有效图片,这里需要将内容写入临时文件(避免直接传入URL触发错误):
// 第三步:验证图片格式有效性 $tempFile = tempnam(sys_get_temp_dir(), 'img_'); file_put_contents($tempFile, $imageData); $isValidImage = getimagesize($tempFile) !== false; unlink($tempFile); // 清理临时文件 return $isValidImage; }
使用示例
在FPDF添加图片前调用验证函数,仅处理有效图片:
$targetUrl = 'https://whisestorageprod.blob.core.windows.net/public/bouwen/Pictures/5226673/200/15f953d227594f2d95628b2975a1b7a9.jpg'; if (isValidImageUrl($targetUrl)) { $pdf->Image($targetUrl, 10, 10, 50); // 替换为你的FPDF参数 } else { // 处理无效图片逻辑:比如添加占位图、跳过该图片或记录日志 $pdf->Cell(50, 20, '图片无效', 1); }
注意事项
- 确保服务器开启curl扩展(大部分环境默认支持);
- 若
allow_url_fopen开启,也可使用file_get_contents替代curl获取内容,但curl的兼容性更强; - 临时文件会自动清理,无需担心磁盘占用。
内容的提问来源于stack exchange,提问作者Senne Vandenputte
相关产品推荐
相关产品推荐

