2013-06-11 3 views
2

Вот мой PHP-код. Он фактически отлично работает:php ftp сделать несколько каталогов

  $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([email protected]_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([email protected]_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 безобразных условия, которые проверяют, существует ли каталог, если мы не создаем его и не переместим в него. И снова для subdir. Поскольку теперь я хочу, чтобы мои каталоги (на ftp-серверах) выглядели как YYYY/MM/DD/username вместо YYYYMMDD/username, мне нужно будет создать еще два из этих блоков if. Он отлично работает, но он не выглядит чистым, я немного маньяк об этом ... Мне было интересно, есть ли лучший способ сделать это, поскольку ftp_mkdir() не может создавать несколько dirs (dir с subdirs в нем)?

для Exemple, принимая во внимание только/загрузки/реж существует, но не/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 

ответ

3
<?php 

// function 
function ftp_mksubdirs($ftpcon,$ftpbasedir,$ftpath){ 
    @ftp_chdir($ftpcon, $ftpbasedir); // /var/www/uploads 
    $parts = explode('/',$ftpath); // 2013/06/11/username 
    foreach($parts as $part){ 
     if([email protected]_chdir($ftpcon, $part)){ 
     ftp_mkdir($ftpcon, $part); 
     ftp_chdir($ftpcon, $part); 
     //ftp_chmod($ftpcon, 0777, $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); 

?> 
+0

отличная функция, окна позволяют создавать сразу несколько папок/папку/подпапку/etc, но Linux не работает, эта функция идеально подходит для нее – user1620090

1

Нашел , может быть, это помогает:

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

, что примерно то же самое, это по-прежнему петляет одна и та же функция ftp_mkdir, я действительно искал выделенную функцию. Я также встретил ваше решение (которое не работает кстати) в руководстве php.net. Хорошо, если это единственный обходной путь ... спасибо. –