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

如何用PHP在不同CodeIgniter应用目录间复制文件?已尝试代码失败

嘿,我来帮你搞定这个跨目录/跨应用的文件复制问题~

首先得先说说你原来的代码为啥跑不通,主要有两个核心问题:

  1. 目标路径只给了目录,没指定文件名:copy()函数要求第二个参数必须是完整的目标文件名(比如./mobile_image/transfer/ftp.php),而不是仅仅一个目录路径,不然PHP不知道要把文件存成啥名字。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:25:18