【问题标题】:php ftp make multiple directoriesphp ftp 创建多个目录
【发布时间】:2013-06-11 18:25:58
【问题描述】:

这是我的 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 服务器。如您所见,有 2 个丑陋的 if 条件检查目录是否存在,如果不存在,我们创建它并移入其中。再次为子目录。因为我现在希望我的目录(在 ftp 服务器上)看起来像 YYYY/MM/DD/username 而不是 YYYYMMDD/username,所以我需要再创建两个这样的 if 块。它工作得很好,但它看起来并不干净,我有点疯狂......我想知道是否有更好的方法来做到这一点,因为 ftp_mkdir() 不能创建多个目录(其中包含子目录的目录)?

例如,仅考虑 /uploads/ 目录存在,但不存在 /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 ftp makefile subdirectory


    【解决方案1】:
    <?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);
    
    ?>
    

    【讨论】:

    • 很棒的功能,windows允许同时创建多个文件夹/folder/subfolder/etc,但是Linux不行,这个功能非常适合它
    • 它节省了我很多时间,因为我要为此制定逻辑,在此之前尝试在这里搜索它,我发现了这个惊人的解决方案。感谢您在这里分享。
    • 这个函数有一个bug!当您尝试创建此路径时:“/4/9/0/foo”,由于 PHP 的 array_filter() 函数,它将导致“/4/9/foo”。
    【解决方案2】:

    找到这个,也许有帮助:

    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");
    }
    

    【讨论】:

    • 差不多,它仍然循环相同的ftp_mkdir函数,实际上我正在寻找一个专用函数。我还在 php.net 手册上遇到了您的解决方案(顺便说一句,它不起作用)。好吧,如果这是唯一的解决方法...谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2013-04-30
    • 2012-03-09
    • 2021-05-25
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多