解决方案 »

  1.   

    这是从网上找的一个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/>';
    }
    }
      

  2.   

    <?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*/
      

  3.   

    好了,是类 多次执行,覆盖了之前的,原生FTP操作 OK