За последние 24 часа нас посетили 17579 программистов и 1595 роботов. Сейчас ищут 1579 программистов ...

php - ftp uploader с возможностью докачки

Тема в разделе "Решения, алгоритмы", создана пользователем Al()en, 20 ноя 2008.

  1. Al()en

    Al()en Активный пользователь

    С нами с:
    4 мар 2006
    Сообщения:
    71
    Симпатии:
    0
    Адрес:
    Сибирская Столица.
    Доброе время суток всем!
    В связи с производственной необходимостью, написал фтп аплоадер, правда ориентирован он на работу из консоли, т.е. вызов его из скриптов $q = `php uploader.php <local_file> <remote_file> <ftp>`.
    Видел разные споры на этом форуме, но такого решения нигде не нашел. Не стал делать фтп-класс, потому что тут всего-то 2 базовых функции..
    В общем возможности:
    1) проверяет что ему скормили в параметрах файл или каталог
    2) рекурсивно отправляет каталоги
    3) проверяет идет ли в данный момент загрузка файла и если идет - выводит сколько уже загружено
    4) умеет докачивать файлы и создавать папки, если они отсутствуют

    Судить строго и со всеми тяжкими :)

    PHP:
    1.  
    2. <?php
    3. function upload($remote_file, $local_file, $ftp_con)
    4. {
    5.    $contents = ftp_nlist($ftp_con, ".");
    6.    
    7.    if (in_array($remote_file, $contents))
    8.    {
    9.       //смотрим размер нужноно файла на серваке
    10.       $ftp_fsize = ftp_size($ftp_con,$remote_file);
    11.       //смотрим рамер локального (Передаваемого) файла
    12.       $local_fsize = filesize($local_file);
    13.       //ждем 2 секунды
    14.       sleep(2);
    15.       //берем еще раз размер файла на серваке
    16.       $ftp_fsize2 = ftp_size($ftp_con,$remote_file);
    17.    }
    18.    else
    19.    {
    20.       $ftp_fsize = $ftp_fsize2 = -1;
    21.       $local_fsize = filesize($local_file);
    22.    }
    23.    
    24.     //если размер увеличился
    25.     if (($ftp_fsize2>$ftp_fsize))
    26.     {
    27.         //если размеры файлов совпадают на локале и на сервере
    28.         if ($local_fsize==$ftp_fsize2)
    29.         {
    30.             return true;
    31.         }
    32.         else
    33.         {
    34.             return 'загружается. '.(round(($ftp_fsize2/$local_fsize),2)*100)."% уже загружено.\n";
    35.         }
    36.     }
    37.     else
    38.     {
    39.         //если размеры файлов совпадают на локале и на сервере
    40.         if ($local_fsize==$ftp_fsize2)
    41.         {
    42.             return "уже есть на сервере.\n";
    43.         }
    44.         //если размер файла не увеличился
    45.         //если файл существует(не было ошибки при узнавании размера файла)
    46.         elseif (($ftp_fsize!=-1)&&($ftp_fsize2!=-1))
    47.         {
    48.             //начинаем закачку с момента разрыва
    49.            if (ftp_put($ftp_con,$remote_file,$local_file,FTP_BINARY,$ftp_fsize))
    50.                return "дозагружено ".round(($local_fsize-$ftp_fsize)/1024)." kb.\n";
    51.            else
    52.                return false;
    53.         }
    54.         else
    55.         {
    56.             //иначе начинаем просто закачку (мало ли - сервер удалил файл или скрипт был запущен ручками с параметрами)
    57.            if (ftp_put($ftp_con,$remote_file,$local_file,FTP_BINARY))
    58.                return true;
    59.            else
    60.                return false;
    61.         }
    62.     }
    63. }    
    64.  
    65. function send_dir($dir_name, $ftp_con)
    66. {
    67.    $i = 0;
    68.    $handle = opendir ($dir_name);
    69.    while($file = readdir($handle))
    70.    {
    71.       if ($file != '.' && $file != '..')
    72.       {
    73.      if (!is_dir($dir_name."/".$file))
    74.      {
    75.         if ($txt = upload($file, $dir_name."/".$file, $ftp_con))
    76.                {
    77.                   if (is_bool($txt))
    78.                      echo $file." загружен на сервер\n";
    79.                   else
    80.                      echo $file." ".$txt;
    81.            }
    82.            else
    83.            {
    84.           echo "Не удалось загрузить $file на сервер\n";
    85.            }
    86.      }
    87.      else
    88.      {
    89.             $contents = ftp_nlist($ftp_con, ".");
    90.             if (in_array($file, $contents))
    91.             {
    92.                ftp_chdir($ftp_con, $file);
    93.                echo "Папка ".$file." уже существует в каталоге. Входим.\n";
    94.             }
    95.             else
    96.             {
    97.                ftp_mkdir($ftp_con, $file);
    98.                ftp_chdir($ftp_con, $file);
    99.                echo "Создана папка ".$file.".\n";
    100.             }
    101.         send_dir($dir_name."/".$file,$ftp_con);
    102.      }
    103.          $i++;
    104.       }
    105.    }
    106.    ftp_chdir($ftp_con,"..");
    107. }
    108.  
    109.  
    110. if ($argc > 4 || $argc <1 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
    111. ?>
    112.  
    113. Это консольный PHP-скрипт для работы с ФТП.
    114. Использование:
    115. <?php echo $argv[0]; ?> <local_file_name> [<remote_file_name>, [<ftp_addr>]]
    116.  
    117. <local_file_name> Файл который необходимо загрузить на ftp-сервер
    118. <remote_file_name> Файл на фтп сервере, если не указан, берется имя локального файла(с путями)
    119. <ftp_addr> Адрес фтп сервера. По умолчанию используется локальный.
    120.  
    121. Опции  --help, -help, -h,
    122. или -? покажут текущую справочную информацию.
    123.          
    124. <?php
    125.     }
    126.     else
    127.     {
    128.       set_time_limit(0);
    129.       echo "Работа с фтп через консоль\n";
    130.      
    131.       if (!isset($argv[3]))
    132.          $ftp = "127.0.0.1";
    133.       else
    134.          $ftp = $argv[3];
    135.      
    136.       //-----------------часть конфига
    137.       $user = "anonymous";
    138.       $pass = "";
    139.       //-------------------------------
    140.       $open = ftp_connect($ftp);
    141.      
    142.       if (!ftp_login($open, $user, $pass))
    143.          die("Не могу соединиться.\n");
    144.       else
    145.          echo "Подключено ".$user."@".$ftp."\n";
    146.  
    147.       ftp_pasv($open, true);        //переходим в пассивный режим
    148.  
    149.       $contents = ftp_nlist($open, ".");
    150.  
    151.       $file = $argv[1];
    152.      
    153.       if (!isset($argv[2]))
    154.          $remote_file = $argv[1];
    155.       else
    156.          $remote_file = $argv[2];
    157.  
    158.         //на фтп отсутствует и это не каталог
    159.       if (!in_array($remote_file,$contents)&&(!is_dir($file)))
    160.       {
    161.          if ($txt = upload($remote_file, $file, $open))
    162.          {
    163.             if (is_bool($txt))
    164.                echo $file." загружен на сервер\n";
    165.             else
    166.                echo $file.$txt;
    167.          }
    168.          else
    169.          {
    170.             echo "Не удалось загрузить $file на сервер\n";
    171.          }
    172.       }
    173.       // на фтп отсутствует, но это каталог
    174.       elseif(!in_array($remote_file,$contents)&&(is_dir($file)))      
    175.       {
    176.             ftp_mkdir($open, $remote_file);
    177.             ftp_chdir($open, $remote_file);
    178.             echo "Создана папка ".$remote_file."\n";
    179.             send_dir($file,$open);
    180.       }
    181.       //на фтп присутствует и это не каталог
    182.       elseif(in_array($remote_file,$contents)&&(!is_dir($file)))
    183.       {
    184.          if ($txt = upload($remote_file, $file, $open))
    185.          {
    186.             if (is_bool($txt))
    187.                echo $remote_file." загружен на сервер\n";
    188.             else
    189.                echo $remote_file.$txt;
    190.          }
    191.          else
    192.          {
    193.             echo "Не удалось загрузить $remote_file на сервер\n";
    194.          }
    195.       }
    196.       //на фтп присутствует и это каталог
    197.       elseif(in_array($remote_file,$contents)&&(is_dir($file)))  
    198.       {
    199.          ftp_chdir($open, $remote_file);
    200.          echo "Каталог ".$remote_file." уже создан. Входим.\n";
    201.          send_dir($file,$open);
    202.       }
    203.      //отключаемся от фтп
    204.       ftp_close($open);
    205.    }
    206. ?>
    207.  
     
  2. Roker

    Roker Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    54
    Симпатии:
    0
    Вот как раз нужно поработать с FTP.

    В принципе у меня скрипт работает через базовые функции. Вот только в сторону докачки я не копал.