>  기사  >  백엔드 개발  >  php ftp上传多个文件时失败

php ftp上传多个文件时失败

WBOY
WBOY원래의
2016-06-23 13:59:511051검색

遍历文件夹,打算批量上传到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');

但像这个的,就连错误输出($this->_error("ftp_unable_to_upload:localpath[".$localpath."]/remotepath[".$remotepath."]");)都没
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 

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.