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/');