CodeIgniter 2使用内置FTP类从FTP下载文件报permission denied错误如何解决
CodeIgniter 2.2.0 FTP下载报错
ftp_get() failed to open stream : permission denied 排查方案 错误核心原因
该报错本质是PHP进程无权限将下载的文件写入指定本地目录,或FTP账号无远程文件的读取权限,同时你的现有代码也存在参数传递错误。
排查步骤
1. 修正代码参数错误
CodeIgniter 2.2.0内置FTP类的download()方法要求:
- 第一个参数为远程单个文件的完整路径,不能仅传目录
- 第二个参数为本地保存的完整文件路径,不能仅传目录
你的现有代码两个参数都传了目录,会直接触发路径读写错误。
2. 检查本地目录权限
你指定的本地存储目录,需要保证运行PHP的系统用户(通常为www-data、apache、nginx等)拥有读写权限:
- Linux环境可执行命令修改权限:
chmod -R 755 你的本地目录绝对路径 - 同步修改目录所有者和PHP运行用户一致:
chown -R www-data:www-data 你的本地目录绝对路径 - 排查阶段可临时设置为777权限验证是否为权限问题,验证完成后改回安全权限
3. 验证FTP端权限
使用FileZilla等FTP客户端,用你代码里配置的同一套FTP账号密码登录,手动尝试下载目标远程文件,确认FTP账号有该文件的读取权限。
4. 调整FTP配置参数
- 大部分FTP服务要求开启被动模式才能正常传输文件,将
$config['passive']改为TRUE - 排查阶段将
$config['debug']改为TRUE,可以输出更详细的连接、传输错误日志 - 增加FTP连接状态判断,避免连接失败后直接执行下载逻辑
修正后代码示例
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class C_FTP extends CI_Controller { public function openfile($fileName) { $this->load->library('ftp'); $config['hostname'] = 'ftp_host'; $config['username'] = 'ftp_username'; $config['password'] = 'ftp_password'; $config['port'] = 'ftp_port'; $config['debug'] = TRUE; // 排查完问题可改回FALSE $config['passive'] = TRUE; // 先判断FTP是否连接成功 if ($this->ftp->connect($config)) { // 补全远程和本地的完整文件路径,不要只传目录 $remote_file_path = 'path/to/folder/' . $fileName; // 建议用CI内置常量拼绝对路径,避免相对路径出错,FCPATH是入口文件所在根目录 $local_file_path = FCPATH . 'local/path/' . $fileName; $download_result = $this->ftp->download($remote_file_path, $local_file_path, 'auto'); echo $download_result ? '下载成功' : '下载失败'; $this->ftp->close(); } else { echo 'FTP连接失败,请检查配置'; } } } ?>
内容的提问来源于stack exchange,提问作者Daffa Al
相关产品推荐
相关产品推荐

