
在 CodeIgniter 中使用 FilesystemIterator 统计文件数时,不能传入 URL 路径(如 base_url() 返回的 http://...),而必须使用服务器本地的绝对文件系统路径(如 /var/www/html/uploads),否则会因协议不支持导致“failed to open dir: not implemented”错误。
在 codeigniter 中使用 `filesystemiterator` 统计文件数时,不能传入 url 路径(如 `base_url()` 返回的 `http://...`),而必须使用服务器本地的绝对文件系统路径(如 `/var/www/html/uploads`),否则会因协议不支持导致“failed to open dir: not implemented”错误。
在 CodeIgniter 项目中,base_url() 返回的是 Web 可访问的 URL 地址(例如 http://localhost/drive/uploads),它用于前端资源引用,并非服务器上的真实文件路径。而 PHP 的 FilesystemIterator、scandir()、glob() 等文件系统函数只能操作本地文件系统路径(即物理磁盘路径),无法处理 HTTP 协议路径,因此直接传入 base_url().'uploads' 必然报错:
FilesystemIterator::__construct(http://localhost/drive/uploads): failed to open dir: not implemented
✅ 正确做法是:使用 __DIR__(当前脚本所在目录)结合相对路径,通过 realpath() 解析出 uploads 目录的绝对物理路径。例如,若你的上传目录位于项目根目录下的 uploads/ 文件夹,且当前代码位于 application/views/ 或其他子目录中,可按层级向上回溯:
<?php // 假设 uploads 目录与 application 同级(标准 CI 结构)
$uploadPath = realpath(__DIR__ . '/../../../uploads');
// 更健壮的写法:兼容不同调用位置,推荐使用 CodeIgniter 的 FCPATH 常量(指向 front controller 所在目录,通常是 index.php 位置)
$uploadPath = FCPATH . 'uploads';
if (!is_dir($uploadPath)) {
die('Uploads directory does not exist or is not readable.');
}
$fi = new FilesystemIterator($uploadPath, FilesystemIterator::SKIP_DOTS);
$fileCount = iterator_count($fi);
printf("There are %d files in the uploads directory.", $fileCount);
?>
? 关键说明:
-
FCPATH是 CodeIgniter 内置常量,指向index.php所在目录(即项目根目录),比手动计算../../../更可靠、可维护; - 务必检查路径是否存在且具有读取权限(
is_dir()+is_readable()); -
FilesystemIterator::SKIP_DOTS可自动跳过.和..,避免误计; - 若需区分文件与子目录,可在循环中使用
$fi->isFile()进行过滤。
⚠️ 注意:切勿在生产环境暴露敏感路径信息,且确保 uploads 目录未被 Web 直接执行 PHP(建议通过 .htaccess 或 Nginx 配置禁止脚本执行)。











