You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中ftp_mksubdirs无法在0命名文件夹内创建子目录的问题

解决PHP FTP在指定文件夹内创建多级子目录的问题

你的问题核心是路径处理逻辑和错误屏蔽导致的目录创建位置错误,具体原因及解决方案如下:

问题根源

  1. 绝对路径与相对路径混淆:你传入的$sub_directories以/开头,即便array_filter过滤掉了开头的空元素,若0目录存在但无进入权限,或FTP路径规则严格,程序会误判0不存在,最终在$base_path下直接创建后续子目录(与0同级)。
  2. 错误屏蔽掩盖真实问题:@ftp_chdir屏蔽了目录切换的错误(比如权限不足、目录大小写不匹配),导致逻辑走偏——明明0目录存在却无法进入,进而在父目录创建后续子目录。

解决方案

方案1:调整路径参数(最简单)

将$sub_directories改为相对路径(去掉开头的/),确保子目录路径相对于$base_path:

$base_path = "/test/";
// 去掉开头的/,表示在$base_path下的0目录内创建子目录
$sub_directories = "0/hv/ygggei/5666";

ftp_mksubdirs($ftp_conn, $base_path, $sub_directories);

或者直接把0合并到$base_path中:

$base_path = "/test/0/";
$sub_directories = "hv/ygggei/5666";

ftp_mksubdirs($ftp_conn, $base_path, $sub_directories);

方案2:优化ftp_mksubdirs函数(更健壮)

去掉错误屏蔽,添加错误判断,确保每一步目录切换/创建都成功:

public static function ftp_mksubdirs($ftpcon, $ftpbasedir, $ftpath) {
    // 切换到基础目录,失败直接返回
    if (!ftp_chdir($ftpcon, $ftpbasedir)) {
        trigger_error("无法切换到基础目录: $ftpbasedir", E_USER_WARNING);
        return false;
    }

    // 分割路径并过滤空元素(处理连续/或开头/的情况)
    $parts = array_filter(explode('/', $ftpath));
    
    foreach ($parts as $part) {
        // 尝试切换到子目录,不屏蔽错误
        if (!ftp_chdir($ftpcon, $part)) {
            // 创建目录,失败抛出错误
            if (!ftp_mkdir($ftpcon, $part)) {
                trigger_error("无法创建目录: $part", E_USER_WARNING);
                return false;
            }
            // 切换到新创建的目录,失败抛出错误
            if (!ftp_chdir($ftpcon, $part)) {
                trigger_error("无法切换到新创建的目录: $part", E_USER_WARNING);
                return false;
            }
        }
    }
    return true;
}

额外检查项

  • 权限验证:确保FTP用户对/test/0目录有读写和执行权限(FTP目录需要执行权限才能进入)。
  • 大小写匹配:FTP服务器通常区分大小写,确认0目录的名称大小写与代码中一致。

内容的提问来源于stack exchange,提问作者Nikhil Dange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:02:51