自定义代码向WordPress上传图片失败 目录可写无报错求助
问题排查与修复方案
现有代码的核心问题
- 变量大小写不匹配:代码中定义的文件名变量是
$fileName(驼峰命名),但获取文件类型时错误使用了未定义的小写变量$filename,PHP大小写敏感,此处会导致文件类型读取失败,同时抛出未定义变量的警告(看不到报错大概率是关闭了PHP错误提示)。 - 目录可写性判断逻辑错误:判断可写性时使用了未定义的变量
$upload_path,此处应该判断的是目标存储目录$uploads['basedir'].'/contracts/'的可写权限;同时当前逻辑仅输出不可写提示,没有终止后续上传逻辑,就算目录不可写仍会执行移动文件操作。 - 缺少上传错误校验:没有判断
$_FILES['upload_img']['error']的状态,若上传过程中出现文件过大、表单异常等问题,临时文件路径不存在,移动操作必然失败。 - 缺少异常分支的输出提示:文件后缀不匹配、移动文件失败的场景都没有任何输出,会误认为没有报错。
修复后的完整代码
// 调试阶段可开启错误提示,上线后删除即可 error_reporting(E_ALL); ini_set('display_errors', 1); $uploads = wp_get_upload_dir(); // 先校验上传是否存在系统级错误 if ($_FILES['upload_img']['error'] !== UPLOAD_ERR_OK) { echo '上传失败,错误码:' . $_FILES['upload_img']['error']; exit; } $fileTmpPath = $_FILES['upload_img']['tmp_name']; $fileName = $_FILES['upload_img']['name']; $fileSize = $_FILES['upload_img']['size']; // 修复变量大小写错误 $fileType = $_FILES['upload_img']['type']; $fileNameCmps = explode(".", $fileName); $fileExtension = strtolower(end($fileNameCmps)); $allowedfileExtensions = array('jpg', 'gif', 'png'); if (!in_array($fileExtension, $allowedfileExtensions)) { echo '不支持的文件格式,仅允许jpg、gif、png'; exit; } $newFileName = md5(time() . $fileName) . '.' . $fileExtension; $target_dir = $uploads['basedir'] . '/contracts/'; $dest_path = $target_dir . $newFileName; // 修复可写性判断的变量错误,判断失败直接终止流程 if (!is_writeable($target_dir)) { echo 'Unable to write to directory.'; exit; } if(move_uploaded_file($fileTmpPath, $dest_path)){ echo $uploads['baseurl'] . '/contracts/' . $newFileName; } else { echo '文件移动失败,请检查临时目录权限或目标目录权限'; }
额外排查建议
- 确认WordPress后台设置的上传目录路径是否和
wp_get_upload_dir()返回的basedir一致,避免路径配置错误导致找不到目录。 - 检查
contracts目录的权限是否为755或775,同时确认目录的所属用户和PHP运行用户一致,避免权限设置正确但所属用户不对导致无法写入。
内容的提问来源于stack exchange,提问作者Noor
相关产品推荐
相关产品推荐

