PHP FTP制作多个目录


php ftp make multiple directories

这是我的PHP代码。它实际上工作得很好:

            $newftpdir_parent   = date('Ymd');                              // YYYYMMDD
            $newftpdir_child    = $ext_folder;                              // username
            $newftpdir          = $newftpdir_parent.'/'.$newftpdir_child;   // YYYYMMDD/username
            $conn_id            = ftp_connect($uptoftp_server);
            ftp_login($conn_id, $uptoftp_username, $uptoftp_pass);
            $path_of_storage    = $uptoftp_path_abs.'/'.$uptoftp_path_rel; // /var/www/uploads
            if( !@ftp_chdir($conn_id, $path_of_storage.'/'.$newftpdir_parent) ){
                  ftp_mkdir($conn_id, $path_of_storage.'/'.$newftpdir_parent);
                  ftp_chmod($conn_id, 0777, $path_of_storage.'/'.$newftpdir_parent);
            }
            if( !@ftp_chdir($conn_id, $path_of_storage.'/'.$newftpdir) ){
                  ftp_mkdir($conn_id, $path_of_storage.'/'.$newftpdir);
                  ftp_chmod($conn_id, 0777, $path_of_storage.'/'.$newftpdir);
            }
            ftp_chdir($conn_id, $path_of_storage.'/'.$newftpdir);
            ftp_put($conn_id, $file_name, $filetoftp, FTP_ASCII);
            ftp_close($conn_id);

从本地服务器上传文件到远程ftp服务器。正如你所看到的,有两个丑陋的if条件来检查目录是否存在,如果不存在,我们创建它并移动它。还有subdir。因为我现在希望我的目录(在ftp服务器上)看起来像YYYY/MM/DD/username,而不是YYYYMMDD/username,我需要创建两个以上的if块。它很好用,但是看起来不干净,我对它有点着迷……我想知道是否有更好的方法来做到这一点,因为ftp_mkdir()不能使多个dirs(其中有子dirs的dir)?

为例,考虑到只有/uploads/dir存在,而/2013/和/06/和/11/:

都不存在。
ftp_mkdir($conn_id, '/var/www/uploads/2013/06/11');

的回报:

Warning: ftp_mkdir() [function.ftp-mkdir]: /var/www/uploads/2013/06/11: No such file or directory in /home/blabla/www/test.php on line 18

<?php
// function
function ftp_mksubdirs($ftpcon,$ftpbasedir,$ftpath){
   @ftp_chdir($ftpcon, $ftpbasedir); // /var/www/uploads
   $parts = array_filter(explode('/',$ftpath)); // 2013/06/11/username
   foreach($parts as $part){
      if(!@ftp_chdir($ftpcon, $part)){
         ftp_mkdir($ftpcon, $part);
         //ftp_chmod($ftpcon, 0775, $part);
         ftp_chdir($ftpcon, $part);
      }
   }
}
// usage
$path_of_storage = '/var/www/uploads';
$newftpdir = '2013/06/11/username';
$conn_id = ftp_connect($ftpserver);
ftp_login($conn_id, $login, $pass);
ftp_mksubdirs($conn_id,$path_of_storage,$newftpdir);
ftp_close($conn_id);
?>

找到了,也许有帮助:

function ftp_mkdir_recusive($con_id,$path){
    $parts = explode("/",$path);
    $return = true;
    $fullpath = "";
    foreach($parts as $part){
            if(empty($part)){
                    $fullpath .= "/";
                    continue;
            }
            $fullpath .= $part."/";
            if(@ftp_chdir($con_id, $fullpath)){
               ftp_chdir($con_id, $fullpath);
            }else{
                    if(@ftp_mkdir($con_id, $part)){
                            ftp_chdir($con_id, $part);
                    }else{
                            $return = false;
                    }
            }
    }
    return $return;
}
$dir = "/2012/05/02/"
if(ftp_mkdir_recusive($con_id,$dir)){
     print("Successfully created $dir");
}else{
    print("There was a problem while creating $dir");
}

这就是解决方案

我定义了完全可以使用的函数(我测试了Wordpress使用没有任何问题):

function ftp_mksubdirs($con_id,$ftpbasedir,$path){
    // Set Base Dir
    if($ftpbasedir == null || ftp_chdir($con_id, $ftpbasedir)){
        //Check If Path is Exist, 
        $exist_ftp = ftp_nlist($con_id, $path);
        if ( (is_array($exist_ftp) && count($exist_ftp) > 0) || $exist_ftp == true ){
            // Path Is Exist, Move to $path
            ftp_chdir($con_id, $path);
            return true;
        }
        // Split Path
        $parts = explode("/",$path);
        
        // Check Part by Part Of Path
        foreach($parts as $part){
            // if Part is not Empty 
            if(!empty($part)){
                /////////////////////////////
                ///   ***  Filters  ***   '''
                if(str_replace(" ","",$part) == ".."){
                    //Go To Parent Directory
                    ftp_cdup($con_id);
                    // Check Next $part
                    continue;
                
                }else if(str_replace(" ","",$part) == ".") {
                    //Ignore & pass
                    continue;
                }
                /// *** [END] Filters *** '''
                /////////////////////////////
                // Check If Folder is Exist
                $exist_ftp2 = ftp_nlist($con_id, $part);
                if ( (is_array($exist_ftp2) && count($exist_ftp2) > 0) || $exist_ftp2 == true ){
                    // Folder Existed.
                    // Move Directory To this Folder
                    ftp_chdir($con_id, $part);
                }else{
                    //If Can Make Folder
                    if(ftp_mkdir($con_id, $part)){
                        // Move Directory To this Folder
                        ftp_chmod($con_id, 0777, $part);
                        ftp_chdir($con_id, $part);
                    }else {
                        // We can't Create Folder, Check Your User Permission.
                        return false;
                    }
                }
            }
        }// End Foreach
    }else{
        //Can't Set The Base
        // return ftp_mksubdirs($con_id,$ftpbasedir,$path);
        return false;
    }
    
    return true;
}

的例子:

$path = "/hamid/reza/irani";
$conn_id = ftp_connect($ftp_server, $ftp_server_port); 
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// if you don't need to change base, set it to null; else : Your Path
// -> I Recommend set it ( the $base )
$base = '/'; // OR $base = null;
if(ftp_mksubdirs($con_id, $base, $path )){
     print("Successfully created $path");
}else{
    print("There was a problem while creating $path");
}

如果这是你的工作!!