记录CodeIgniter FTP 类遇到的一些坑

CodeIgniter 的 FTP 类允许你传输文件到远程服务器,也可以对远程文件进行移动、重命名或删除操作。 FTP 类还提供了一个 "镜像" 功能,允许你将你本地的一个目录通过 FTP 整个的同步到远程服务器上。

看起来似乎很方便,但实际使用中遇到一些文档中未提到的坑,踩完之后做个简单的记录,以免忘记。

FTP上传的文件损坏

使用的是upload方法,官方的参考代码如下:

$this->ftp->upload('/local/path/to/myfile.html', '/public_html/myfile.html', 'ascii', 0775);

发现上传后的文件永远是损坏的,解决办法是将ascii模式修改为二进制模式binary,代码如下:

$this->ftp->upload('/local/path/to/myfile.html', '/public_html/myfile.html', 'binary', 0775);

再次上传,文件大小正常,问题得以解决。

无法创建目录

FTP类使用mkdir创建目录,官方的代码如下:

$this->ftp->mkdir('/public_html/foo/bar/', 0755);

看似没有问题,但是开启DeBUG模式后永远提示你无法创建文件夹,原因是mkdir方法无法递归创建目录,也就是说,假如/public_html/foo这个目录不存在,那么你就无法创建目录/public_html/foo/bar/,这个是非常坑的,官方并没有任何说明无法递归创建目录。

解决办法是修改默认的FTP类/system/libraries/Ftp.php在末尾追加一个递归创建目录的方法,代码如下:

 /**
 * 递归生成目录
 *
 * @param    string    $path
 */
function rec_mkdir($path)
{
    $path_arr  = explode('/',$path);  // 取目录数组
    $path_arr  = array_filter($path_arr);   //过滤空目录
    $path_div  = count($path_arr);  // 取层数

    foreach($path_arr as $val)  // 创建目录
    {
        if(@ftp_chdir($this->conn_id,$val) == FALSE)
        {
            $tmp = @ftp_mkdir($this->conn_id,$val);
            if($tmp == FALSE)
            {
                echo "目录创建失败,请检查权限及路径是否正确!";
                exit;
            }
            @ftp_chdir($this->conn_id,$val);
        }
    }

    for($i=1;$i<=$path_div;$i++)  // 回退到根
    {
        @ftp_cdup($this->conn_id);
    }
}

如果需要递归创建目录再调用rec_mkdir方法即可,代码如下:

$this->ftp->rec_mkdir('/public_html/foo/bar/');

参考

标签: CodeIgniter

发表评论: