如何用PHP在不同CodeIgniter应用目录间复制文件?已尝试代码失败
嘿,我来帮你搞定这个跨目录/跨应用的文件复制问题~
首先得先说说你原来的代码为啥跑不通,主要有两个核心问题:
- 目标路径只给了目录,没指定文件名:
copy()函数要求第二个参数必须是完整的目标文件名(比如./mobile_image/transfer/ftp.php),而不是仅仅一个目录路径,不然PHP不知道要把文件存成啥名字。 - HTTP URL复制依赖
allow_url_fopen配置:用copy()直接拉取HTTP URL的文件,需要PHP配置里的allow_url_fopen参数开启,很多生产环境为了安全会默认关闭这个选项,这也会导致复制失败。
下面给你几个靠谱的解决方法,按需选择:
方法1:修复原有的copy()代码(适合allow_url_fopen开启的环境)
先修正目标路径,同时确保目标目录存在,代码示例:
// 源文件的HTTP URL $source_file = 'http://xxxxxx/jakson_solar/ftp.php'; // 目标路径必须包含完整文件名,不能只写目录 $target_file = './mobile_image/transfer/ftp.php'; // 先检查allow_url_fopen是否开启 if (!ini_get('allow_url_fopen')) { echo "错误:PHP配置的allow_url_fopen未开启,无法通过HTTP复制文件"; die; } // 确保目标目录存在,不存在则递归创建 $target_dir = dirname($target_file); if (!is_dir($target_dir)) { mkdir($target_dir, 0755, true); // 0755是目录权限,true支持多级创建 } // 执行复制 if (copy($source_file, $target_file)) { echo "复制成功!"; } else { echo "复制失败,请检查:1. 源URL是否可访问;2. 目标目录是否有写入权限"; }
方法2:用cURL复制(更稳定,不受allow_url_fopen限制)
如果你的服务器关闭了allow_url_fopen,用cURL是更稳妥的选择,它不依赖这个配置:
$source_url = 'http://xxxxxx/jakson_solar/ftp.php'; $target_file = './mobile_image/transfer/ftp.php'; // 确保目标目录存在 $target_dir = dirname($target_file); if (!is_dir($target_dir)) { mkdir($target_dir, 0755, true); } // 初始化cURL和文件句柄 $ch = curl_init($source_url); $fp = fopen($target_file, 'wb'); // 设置cURL选项:跟随重定向、超时、写入到文件 curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 执行请求 $result = curl_exec($ch); // 关闭资源 curl_close($ch); fclose($fp); // 检查结果 if ($result) { echo "复制成功!"; } else { echo "复制失败:" . curl_error($ch); }
方法3:同一服务器下直接用本地文件路径(效率最高)
如果两个CodeIgniter应用在同一台服务器上,完全没必要走HTTP,直接用本地文件路径复制效率更高,还能避免网络问题:
// 假设第一个CI应用的根目录是/var/www/jakson_solar/(根据你的实际路径修改) $source_file = '/var/www/jakson_solar/ftp.php'; // 用CodeIgniter内置的FCPATH常量获取当前应用的根目录,拼接目标路径 $target_file = FCPATH . 'mobile_image/transfer/ftp.php'; // 确保目标目录存在 $target_dir = dirname($target_file); if (!is_dir($target_dir)) { mkdir($target_dir, 0755, true); } if (copy($source_file, $target_file)) { echo "复制成功!"; } else { echo "复制失败,请检查:1. 源文件是否存在;2. 目标目录是否有写入权限"; }
额外注意事项
- 权限问题:目标目录必须给PHP进程(通常是
www-data用户)赋予写入权限,不然会复制失败。 - 源文件可访问性:如果用HTTP方式,要确保源URL没有防盗链、登录验证等限制,能直接访问。
- CodeIgniter安全:如果是处理用户上传的文件,一定要做好文件名过滤和验证,避免安全风险。
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

