PHP中ftp_mksubdirs无法在0命名文件夹内创建子目录的问题
解决PHP FTP在指定文件夹内创建多级子目录的问题
你的问题核心是路径处理逻辑和错误屏蔽导致的目录创建位置错误,具体原因及解决方案如下:
问题根源
- 绝对路径与相对路径混淆:你传入的
$sub_directories以/开头,即便array_filter过滤掉了开头的空元素,若0目录存在但无进入权限,或FTP路径规则严格,程序会误判0不存在,最终在$base_path下直接创建后续子目录(与0同级)。 - 错误屏蔽掩盖真实问题:
@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
相关产品推荐
相关产品推荐

