Heim > Artikel > Backend-Entwicklung > php ftp上传多个文件时失败
遍历文件夹,打算批量上传到FTP上,li下有 dir和 files两个数组,一个是目录数组,一个文件数组
用ftp上传时失败,单个上传没有问题??? 怎么解决啊
foreach ($li['files'] as $i){ $c+=1; $ftp->upload($i,$i); if($c>= count($li['files'])/2) {set_time_limit(300);}}
你有创建目录吗?
你有创建目录吗?
有啊有啊, 第一个文件好像可以,后续就不行了
我没看到,不好说
我没看到,不好说
这是从网上找的一个PHP FTP类 ,加了个遍历文件夹函数,单个文件上传没一点问题,如果用foreach的话连错误输出都没有,
VAR_DUMP也没输出,像下面这种单个的加好多条都没问题,能传上去,
$ftp->upload('smx/ewm/ewm.html','smx/ewm/ewm.html');
foreach ($li['files'] as $i){ $c+=1; $r = $ftp->upload($i,$i); if($r){ echo 'ok- '.$i.'<br/>'; }else{ echo 'fail- '.$i.'<br/>'; }}
?<?php/** * 仿写CodeIgniter的FTP类 * FTP基本操作: * 1) 登陆; connect * 2) 当前目录文件列表; filelist * 3) 目录改变; chgdir * 4) 重命名/移动; rename * 5) 创建文件夹; mkdir * 6) 删除; delete_dir/delete_file * 7) 上传; upload * 8) 下载 download * * @author quanshuidingdang */class Ftp { private $hostname = ''; private $username = ''; private $password = ''; private $port = 21; private $passive = TRUE; private $debug = TRUE; private $conn_id = FALSE; /** * 构造函数 * * @param array 配置数组 : $config = array('hostname'=>'','username'=>'','password'=>'','port'=>''...); */ public function __construct($config = array()) { if(count($config) > 0) { $this->_init($config); } } /** * FTP连接 * * @access public * @param array 配置数组 * @return boolean */ public function connect($config = array()) { if(count($config) > 0) { $this->_init($config); } if(FALSE === ($this->conn_id = @ftp_connect($this->hostname,$this->port))) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_connect"); } return FALSE; } if( ! $this->_login()) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_login"); } return FALSE; } if($this->passive === TRUE) { ftp_pasv($this->conn_id, TRUE); } return TRUE; } /** * 目录改变 * * @access public * @param string 目录标识(ftp) * @param boolean * @return boolean */ public function chgdir($path = '', $supress_debug = FALSE) { if($path == '' OR ! $this->_isconn()) { return FALSE; } $result = @ftp_chdir($this->conn_id, $path); if($result === FALSE) { if($this->debug === TRUE AND $supress_debug == FALSE) { $this->_error("ftp_unable_to_chgdir:dir[".$path."]"); } return FALSE; } return TRUE; } /** * 目录生成 * * @access public * @param string 目录标识(ftp) * @param int 文件权限列表 * @return boolean */ public function mkdir($path = '', $permissions = NULL) { if($path == '' OR ! $this->_isconn()) { return FALSE; } $result = @ftp_mkdir($this->conn_id, $path); if($result === FALSE) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_mkdir:dir[".$path."]"); } return FALSE; } if( ! is_null($permissions)) { $this->chmod($path,(int)$permissions); } return TRUE; } /** * 生成批量目录,目录数组要排序 * * @access public * @param string 目录标识(ftp) * @param int 文件权限列表 * @return boolean */ public function mkpdir($path = array()) { if($path == '' OR ! $this->_isconn()) { return FALSE; } foreach ($path as $d){ $result = @ftp_mkdir($this->conn_id, $d); if($result === FALSE) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_mkpdir:dir[".$path."]"); } return FALSE; } } return TRUE; } /** * 上传 * * @access public * @param string 本地目录标识 * @param string 远程目录标识(ftp) * @param string 上传模式 auto || ascii * @param int 上传后的文件权限列表 * @return boolean */ public function upload($localpath, $remotepath, $mode = 'auto', $permissions = NULL) { if( ! $this->_isconn()) { return FALSE; } if( ! file_exists($localpath)) { if($this->debug === TRUE) { $this->_error("ftp_no_source_file:".$localpath); } return FALSE; } if($mode == 'auto') { $ext = $this->_getext($localpath); $mode = $this->_settype($ext); } $mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY; $result = @ftp_put($this->conn_id, $remotepath, $localpath, $mode); if($result === FALSE) { if($this->debug === TRUE) { $this->_error("ftp_unable_to_upload:localpath[".$localpath."]/remotepath[".$remotepath."]"); //这条错误输出都没 } return FALSE; } if( ! is_null($permissions)) { $this->chmod($remotepath,(int)$permissions); } return TRUE; } /** * 文件批量上传 * * @access public * @param string 本地目录标识 * @param string 远程目录标识(ftp) * @param string 上传模式 auto || ascii * @param int 上传后的文件权限列表 * @return boolean */ public function uppload($file) { if( ! $this->_isconn()) { return FALSE; } foreach($file as $i){ $this->upload($i,$i); } return TRUE; } /** * 关闭FTP * * @access public * @return boolean */ public function close() { if( ! $this->_isconn()) { return FALSE; } return @ftp_close($this->conn_id); } /** * FTP成员变量初始化 * * @access private * @param array 配置数组 * @return void */ private function _init($config = array()) { foreach($config as $key => $val) { if(isset($this->$key)) { $this->$key = $val; } } //特殊字符过滤 $this->hostname = preg_replace('|.+?://|','',$this->hostname); } /** * FTP登陆 * * @access private * @return boolean */ private function _login() { return @ftp_login($this->conn_id, $this->username, $this->password); } /** * 判断con_id * * @access private * @return boolean */ private function _isconn() { if( ! is_resource($this->conn_id)) { if($this->debug === TRUE) { $this->_error("ftp_no_connection"); } return FALSE; } return TRUE; } /** * 从文件名中获取后缀扩展 * * @access private * @param string 目录标识 * @return string */ private function _getext($filename) { if(FALSE === strpos($filename, '.')) { return 'txt'; } $extarr = explode('.', $filename); return end($extarr); } /** * 从后缀扩展定义FTP传输模式 ascii 或 binary * * @access private * @param string 后缀扩展 * @return string */ private function _settype($ext) { $text_type = array ( 'txt', 'text', 'php', 'phps', 'php4', 'js', 'css', 'htm', 'html', 'phtml', 'shtml', 'log', 'xml' ); return (in_array($ext, $text_type)) ? 'ascii' : 'binary'; } function listDir($dirname) { static $r = array( 'dir' => array(), 'files' => array(), ); $dir = opendir ($dirname ); while (($file = readdir ($dir )) != false ) { if ($file == "." || $file == "..") { continue; } if (is_dir ($dirname . "/" . $file )) { array_push ($r['dir'], $dirname . "/" . $file ); $this->listDir ($dirname . "/" . $file ); } else { array_push ($r['files'], $dirname . "/" . $file ); $this->upload($dirname . "/" . $file,$dirname . "/" . $file); } } return $r; } /** * 错误日志记录 * * @access prvate * @return boolean */ private function _error($msg) { if(gettype($msg) == 'array'){ return @file_put_contents('ftp_err.log', "date[".date("Y-m-d H:i:s")."]-hostname[".$this->hostname."]-username[".$this->username."]-password[".$this->password."]-msg[".implode('-',$msg)."]\n", FILE_APPEND); }else{ return @file_put_contents('ftp_err.log', "date[".date("Y-m-d H:i:s")."]-hostname[".$this->hostname."]-username[".$this->username."]-password[".$this->password."]-msg[".$msg."]\n", FILE_APPEND); } }}/*End of file ftp.php*//*Location /Apache Group/htdocs/ftp.php*/
好了,是类 多次执行,覆盖了之前的,原生FTP操作 OK