PHP 8环境下getimagesize报Filename cannot be empty错误如何解决?
问题产生原因
isset()仅校验目标数组元素是否存在且值不为null:当文件上传流程出现异常(例如未选择文件就提交表单、上传文件大小超过php.ini配置的上限、表单POST大小超出限制)时,$_FILES["nuevaFoto"]["tmp_name"]会被赋值为空字符串,此时isset()仍然返回true,原本的校验条件会被直接绕过。- PHP 8.0 大幅提升了内置函数的参数校验严格度:PHP 7.3 版本下,给
getimagesize()传入空字符串仅会产生警告级别的报错,函数返回false不会中断程序运行;PHP 8.0 开始这类非法参数会直接抛出Error级别的错误,直接终止逻辑执行,因此会出现明确的Filename cannot be empty报错。
解决办法
你需要调整校验逻辑,确保只有临时文件路径有效时才调用getimagesize(),推荐以下几种实现方案:
1. 基础修复写法
直接将isset()替换为empty()校验,过滤空路径的场景:
if(!empty($_FILES["nuevaFoto"]["tmp_name"])) { list($ancho, $alto) = getimagesize($_FILES["nuevaFoto"]["tmp_name"]); }
2. 生产环境安全写法
额外增加is_uploaded_file()校验,避免路径伪造导致的安全漏洞,同时兼容$_FILES键不存在的场景:
$tmpPath = $_FILES["nuevaFoto"]["tmp_name"] ?? ''; if ($tmpPath && is_uploaded_file($tmpPath)) { list($ancho, $alto) = getimagesize($tmpPath); }
3. 全兼容异常处理写法
如果需要兼容非图片上传、文件读取失败等边缘场景,可以增加返回值判断和异常捕获:
$tmpPath = $_FILES["nuevaFoto"]["tmp_name"] ?? ''; if ($tmpPath && is_uploaded_file($tmpPath)) { try { $imageInfo = getimagesize($tmpPath); if ($imageInfo) { list($ancho, $alto) = $imageInfo; } else { // 自定义非图片文件的处理逻辑 } } catch (\Error $e) { // 自定义参数错误、文件读取失败的异常处理逻辑 } }
内容的提问来源于stack exchange,提问作者luis fernando
相关产品推荐
相关产品推荐

