WordPress网站exif_imagetype()报错:stream does not support seeking求助
解决exif_imagetype()报错:stream does not support seeking
错误详情
Warning: exif_imagetype(): stream does not support seeking in /home/customer/www/panamafasteners.com/public_html/wp-includes/functions.php online 3265.
该报错来自WordPress核心函数wp_get_image_mime中调用exif_imagetype()的代码行,相关核心代码如下:
function wp_get_image_mime( $file ) { /* * Use exif_imagetype() to check the mimetype if available or fall back to * getimagesize() if exif isn't available. If either function throws an Exception * we assume the file could not be validated. */ try { if ( is_callable( 'exif_imagetype' ) ) { // ---- the line below errors! ---- $imagetype = exif_imagetype( $file ); $mime = ( $imagetype ) ? image_type_to_mime_type( $imagetype ) : false; } elseif ( function_exists( 'getimagesize' ) ) { // Don't silence errors when in debug mode, unless running unit tests. if ( defined( 'WP_DEBUG' ) && WP_DEBUG && ! defined( 'WP_RUN_CORE_TESTS' ) ) { // Not using wp_getimagesize() here to avoid an infinite loop. $imagesize = getimagesize( $file ); } else { // phpcs:ignore WordPress.PHP.NoSilencedErrors $imagesize = @getimagesize( $file ); } $mime = ( isset( $imagesize['mime'] ) ) ? $imagesize['mime'] : false; } else { $mime = false; } }
报错原因
exif_imagetype()函数要求传入的文件流支持随机读取(seek),但如果传入的$file是以下情况,就会触发该警告:
- 远程图片URL(无法直接seek)
- 未保存到本地的临时数据流
- 受权限限制或指针无法重置的文件句柄
WordPress核心函数默认未处理这类不可seek的场景,直接调用exif_imagetype()导致报错。
解决方案
方案1:用钩子替换函数(推荐,不修改核心)
在主题的functions.php文件中添加以下代码,通过钩子覆盖原函数逻辑,遇到报错时自动降级到getimagesize():
add_filter('wp_get_image_mime', 'fixed_wp_get_image_mime', 10, 2); function fixed_wp_get_image_mime($mime, $file) { // 原函数返回false时,用getimagesize重试 if ($mime === false && function_exists('getimagesize')) { $imagesize = @getimagesize($file); return isset($imagesize['mime']) ? $imagesize['mime'] : false; } return $mime; }
方案2:处理远程图片(针对URL场景)
如果报错是因为处理远程图片URL,可先下载到本地临时文件再验证:
function get_remote_image_mime($url) { $temp_file = wp_tempnam('remote-image'); if ($temp_file && copy($url, $temp_file)) { $mime = wp_get_image_mime($temp_file); unlink($temp_file); // 用完删除临时文件 return $mime; } // 下载失败直接用getimagesize $imagesize = @getimagesize($url); return isset($imagesize['mime']) ? $imagesize['mime'] : false; }
方案3:修改核心函数(不推荐)
直接修改wp-includes/functions.php中的wp_get_image_mime函数,添加错误捕获和指针重置逻辑(注意:WordPress更新后会覆盖修改,需重复操作):
function wp_get_image_mime( $file ) { try { if ( is_callable( 'exif_imagetype' ) ) { // 重置文件指针(针对资源类型) if (is_resource($file)) { rewind($file); } // 捕获"不支持seek"的警告 set_error_handler(function($errno, $errstr) { return strpos($errstr, 'stream does not support seeking') !== false; }); $imagetype = exif_imagetype( $file ); restore_error_handler(); $mime = ( $imagetype ) ? image_type_to_mime_type( $imagetype ) : false; } elseif ( function_exists( 'getimagesize' ) ) { // 原代码保留 if ( defined( 'WP_DEBUG' ) && WP_DEBUG && ! defined( 'WP_RUN_CORE_TESTS' ) ) { $imagesize = getimagesize( $file ); } else { $imagesize = @getimagesize( $file ); } $mime = ( isset( $imagesize['mime'] ) ) ? $imagesize['mime'] : false; } else { $mime = false; } return $mime; } catch (Exception $e) { return false; } }
方案对比
- 钩子方案:最安全,不修改核心代码,WordPress更新无影响,优先选择;
- 远程图片方案:专门针对URL场景,逻辑清晰;
- 核心修改方案:不推荐,维护成本高,更新后需重新修改。
内容的提问来源于stack exchange,提问作者Valeria Silva
相关产品推荐
相关产品推荐

