Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как скопировать папки с файлами с ftp на локальный компьютер
 
 автор: tonechka   (15.09.2010 в 18:48)   письмо автору
 
 

Собственно в названии темы вопрос. есть определенная иерархия папок, в них файлы. нужно все это в таком же составе скопировать в на локальный пк. как это можно сделать?

  Ответить  
 
 автор: sim5   (15.09.2010 в 19:02)   письмо автору
 
   для: tonechka   (15.09.2010 в 18:48)
 

Открываете FTP и копируете.

  Ответить  
 
 автор: tonechka   (15.09.2010 в 19:05)   письмо автору
 
   для: sim5   (15.09.2010 в 19:02)
 

Ну так мне нужно с помощью php- скрипта. я поняла как соединится с ftp, как просмотреть содержимое, но не могу понять с помощью какой функции можно скопировать папку.

  Ответить  
 
 автор: sim5   (15.09.2010 в 19:53)   письмо автору
 
   для: tonechka   (15.09.2010 в 19:05)
 

>Ну так мне нужно с помощью php- скрипта

Выполняемого на сервере?

  Ответить  
 
 автор: V@ldem@r   (15.09.2010 в 20:55)   письмо автору
 
   для: sim5   (15.09.2010 в 19:53)
 

У меня аналогичный вопрос.
Есть фтп сервер, на котором есть определенное кол-во каталогов с файлами. Как скопировать на другой хост (не фтп) все эти каталоги с файлами, соблюдая иерархию.
У меня пока только получается файлы скачивать.
Вот мой скрипт.


  $host = "ftp.com";
  $connect = ftp_connect($host);
  if(!$connect)
    {
    echo("Ошибка соединения");
    exit;
    }
  $user = "test";
  $pass = "111";
  $result = ftp_login($connect, $user, $pass);
   
   if (!$result)
    { 
   echo "ошибка авторизации!!!";
    }
  // скачиваю файл с сервера фтп
  $download = ftp_get ($connect, "222.txt", "222.txt", FTP_ASCII);

  Ответить  
 
 автор: sim5   (15.09.2010 в 21:47)   письмо автору
 
   для: V@ldem@r   (15.09.2010 в 20:55)
 

Вы считаете, что ваша задача аналогична задаче автора темы?

  Ответить  
 
 автор: V@ldem@r   (15.09.2010 в 22:24)   письмо автору
 
   для: sim5   (15.09.2010 в 21:47)
 

автор: tonechka (15.09.2010 в 18:48) письмо автору

Собственно в названии темы вопрос. есть определенная иерархия папок, в них файлы. нужно все это в таком же составе скопировать в на локальный пк. как это можно сделать?



У меня аналогичный вопрос.
Есть фтп сервер, на котором есть определенное кол-во каталогов с файлами. Как скопировать на другой хост (не фтп) все эти каталоги с файлами, соблюдая иерархию.

А разве смысл не один и тот же?
Что же тут разного?
Если только автор пишет, что на локальный пк хочет скопировать, а я на хост. Хотя это одно и то же.

  Ответить  
 
 автор: sim5   (15.09.2010 в 22:35)   письмо автору
 
   для: V@ldem@r   (15.09.2010 в 22:24)
 

>Если только автор пишет, что на локальный пк хочет скопировать, а я на хост. Хотя это одно и то же.

Даже одно и то же? Это смотря где скрипт у автора, и если на сервере удаленном, то каким образом это вообще выполнимо?

  Ответить  
 
 автор: V@ldem@r   (15.09.2010 в 22:58)   письмо автору
 
   для: sim5   (15.09.2010 в 22:35)
 

Согласен.
В моем случае это пока на локальном веб сервере надо осуществить.
Суть вопроса моего была не в этом. А в том как все это сделать.
Т.е. скопировать каталоги с файлами в нужную мне директорию на моем локальном сервере.

  Ответить  
 
 автор: sim5   (15.09.2010 в 23:05)   письмо автору
 
   для: V@ldem@r   (15.09.2010 в 22:58)
 

Как сделать... ну наверное получить список директорий, создавая на своем подобные, затем переходить по директориям и закачивать файлы к себе. Вы в функции работы с FTP заглядывали?

  Ответить  
 
 автор: V@ldem@r   (15.09.2010 в 23:27)   письмо автору
 
   для: sim5   (15.09.2010 в 23:05)
 

конечно.
а как проверить что на фтп сервере лежит именно каталог? Вернее условие на различие каталогов от файлов?

Примерно так?
У меня с путями к каталогам на фтп заморочки.

$site = ftp_nlist($connect,""); 
    
    foreach ($site as $value)
    {
       $dirname="/111";  //захожу во вложенную папку
       $dirpast="h:/test"; //буду копировать в этот каталог
       //проверяю на существование каталога, если каталог, то создаем папку на локальном сервере
             if(is_dir($dirname."/".$value)) 
         {
           mkdir($dirpast."/".$value);
         }
    }

  Ответить  
 
 автор: heed   (16.09.2010 в 00:59)   письмо автору
 
   для: V@ldem@r   (15.09.2010 в 23:27)
 

если только имена из ftp_nlist()
то как-нибудь с подзапросом типа if (ftp_size($link, '/root/dir') != -1)
если получали список с помощью ftp_rawlist() то всё уже в массиве.

// php-скрипт может и не проработать столько времени сколько может рекурсивно копироваться дирректория

////array ftp_rawlist ( resource $ftp_stream , string $directory [, bool $recursive= false ] )

  Ответить  
 
 автор: tonechka   (16.09.2010 в 19:59)   письмо автору
 
   для: V@ldem@r   (15.09.2010 в 22:58)
 

>Т.е. скопировать каталоги с файлами в нужную мне директорию на моем локальном сервере.

Мне нужно аналогичное сделать.... только я не пойму как обходить папки и подпапки....может кто нибудь хоть примерный скриптик выложить?

  Ответить  
 
 автор: .....   (16.09.2010 в 20:20)
 
   для: tonechka   (16.09.2010 в 19:59)
 

примерно так-же как удаляют непустые папки

id_theme=56939

  Ответить  
 
 автор: V@ldem@r   (19.09.2010 в 20:48)   письмо автору
 
   для: .....   (16.09.2010 в 20:20)
 

А может кто-нибудь подскажет, как при помощи условия в цикле перебрать инфу на фтп и узнать, каталог это или файл?

И например, если это каталог, то создать папку с таким же именем на локальном сервере, а если это файл, то скачать его.

Что-то вот так. Пока просто не пойму как это реализовать.

  Ответить  
 
 автор: tonechka   (20.09.2010 в 22:28)   письмо автору
 
   для: V@ldem@r   (19.09.2010 в 20:48)
 

СКажите, а как проверить на фтп файл или папка передо мной?

  Ответить  
 
 автор: heed   (20.09.2010 в 23:56)   письмо автору
 
   для: tonechka   (20.09.2010 в 22:28)
 

ну давали-же Вам ссылку :)

Неужели нельзя без комментариев поразбираться и позаменять удаление на нужное

<? 
function ftp_dd($link$dir
// рекурсивная функция , обходит папки
{  
  
$list ftp_nlist($link$dir);  //получение списка имён
  
$jcou count($list);  // колличество полученных имён
  
if ($jcou 2) { // если  имён два , то это '.' и '..'
  
for($j 0$j $jcou$j++)  
  { 
    
$fil $list[($j)]; // в $fil  как и в  $list[($j)] просто имя
    
if (($fil == '.') or ($fil == '..')) continue;  // пропуск ненужного
    
$fl $dir '/' $fil ;   // В $fl полный путь от корня сервера
    
if (ftp_size($link$fl) != -1) {  // если полный путь это файл
          // @ftp_delete($link, $fl); 
# тут надо использовать ftp_get()
    
} else { // если папка
# тут надо создать папку,
        // и вызов снова этой функцию 
        
ftp_dd($link$fl);  
} } } 
    
//if(@ftp_rmdir($link, $dir)) ненадо 
}

/*

Вызывается например так 
 ftp_dd($link, '/ftpdir')

*/



1. ftp_rawlist() вместо ftp_nlist() позволит не проверять каждое имя, посылая запросы на ftp-сервер, будет известно сразу файл или папка

2. здесь не хватает передачи локального пути к локальной папке. Нужно добавить функции ещё один параметр

3. Убрал return 1 или return 0. Нужно просто добавить при невыполнении создания папки или ftp_get или при невыполнении nlist , например return 0
и в самом конце функции return 1, тогда например вместо ftp_dd($link, $fl); можно будет написать if (! ftp_dd($link, $fl) ) return 0;

4, соответственно везде надо поставить echo перед return 0 при ошибках , чтобы знать на каком месте оборвалось выполнение

5.Для этого-же, нужно показывать каждое имя файла + ещё если скрипт ничего не покажет в течении KeepAliveTimeout (такая настройка в httpd.conf по умолчанию 5 секунд), то сервер просто убьёт выполнение этого скрипта, и поэтому нужно после echo вызывать почаще ещё и flush();

Вот то немногое что остаётся добавить :) и Как уже говорилось , ещё не факт что так сможете скопировать большую дирректорию.

  Ответить  
 
 автор: tonechka   (21.09.2010 в 11:41)   письмо автору
 
   для: heed   (20.09.2010 в 23:56)
 

Наверное, я совсем тупа... я вот что делаю:

function ftp_recursive_copy($connect,$dir_local,$dir_remote) 
{
 echo ftp_pwd($connect);
 echo $dir_local;
 
 $site = ftp_rawlist($connect,$dir_remote);//для всех файлов цикл
 if (!$site) {echo "НЕТ списка"; return 0;}

 foreach ($site as $value)
 {
  if (($value == '.') or ($value == '..')) continue; 
  
  if (ftp_size($connect, $value)!=-1) //если файл
      {
      ftp_get($connect,$dir_local.'/'.$value,$dir_remote.'/'.$value, FTP_BINARY);//копирую его в новую папку
      if (!ftp_get) {echo "Не могу сокпировать файл"; return 0;}    
    }
  else
      {
      mkdir($dir_local.'/'.$value);
    ftp_recursive_copy($connect,$dir_local.'/'.$value, $value);//если папка, то снова вызываю функцию
    }
 }
return 1;
}

ftp_recursive_copy($connect,'D:/222','/ftp');


соответственно он мне выдает, имя папки, в которой сейчас нахожусь, имя локальной папки, куда надо скопировать, и что не может вывести список файлов.... В чем ошибка то???

  Ответить  
 
 автор: heed   (21.09.2010 в 17:52)   письмо автору
 
   для: tonechka   (21.09.2010 в 11:41)
 

В случае с ftp_rawlist() всё упрощается тем что не надо делать ftp_size($connect, $value) (эта функция выполняет запрос к фтп-серверу )
но немного усложняется тем что в массиве нечто более информативное :) чем имена файлов.

я не знаю сможете-ли понять что там из такого отрывка кода
<?
$file_list 
ftp_rawlist($link$d);

foreach(
$file_list AS $fl)

list(
$mode$bloks,
     
$group$user$size,
     
$month$day,
     
$year$file) = preg_split("/\s+/"$fl);


в $mode например может быть -rwxrwxr-x или drwxr-x-rx или lrwxrwxrwx , первый символ в случае с файлом будет '-' с дирректорией 'd' с символической ссылкой 'l'
а там или
if (substr($mode, 0, 1) == 'd')
или
if (($mode[0] == 'd')

надо-же хотя-бы заглядывать что в переменных с помощью var_dump()
а ещё лучше заглядывать ещё и в документацию. К каждой функции есть чёткое описание

>ftp_pwd()
С текущими дирректориями всё сложнее , чем работать с полными путями. php во время работы одного скрипта может даже переподключиться, не говоря о смене дирректорий
(незнаю чего там делаел php , но из дирректорий в которые его просят перейти он точно выскакивает после одной-двух таких комманд
)
ftp_get($connect,$dir_local.'/'.$value,$dir_remote.'/'.$value, FTP_BINARY);//копирую его в новую папку
if (!ftp_get) {echo "Не могу сокпировать файл"; return 0;}


наверное имелось ввиду
if(! ftp_get($connect,$dir_local.'/'.$value,$dir_remote.'/'.$value, FTP_BINARY) { echo "Не могу сокпировать файл"; return 0; }

  Ответить  
 
 автор: heed   (21.09.2010 в 18:09)   письмо автору
 
   для: tonechka   (21.09.2010 в 11:41)
 

Не знаю найдёте-ли документацию php на русском языке
А Вы читали справочник ? :)
http://softtime.ru/group/id_group=8

// Совсем забыл про то что здесь всегда лежал скрипт http://softtime.ru/info/ftpmove.php
Можно поразбираться как там всё работало

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования