Загрузить весь каталог через PHP FTP - PullRequest
16 голосов
/ 29 мая 2009

Я пытаюсь написать скрипт, который будет загружать все содержимое каталога, хранящегося на моем сервере, на другие серверы через ftp.

Я читал документацию на www.php.net , но, похоже, не могу найти способ загружать более одного файла за раз.

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

Заранее спасибо за помощь!

Ответы [ 5 ]

13 голосов
/ 29 мая 2009

Если у вас открыто соединение, последовательная загрузка содержимого каталога проста:

foreach (glob("/directory/to/upload/*.*") as $filename)
    ftp_put($ftp_stream, basename($filename) , $filename, FTP_BINARY);

Загрузка всех файлов параллельно будет сложнее.

5 голосов
/ 09 июля 2014

Итак, я взял код @ iYETER и обернул его как объект класса.

Вы можете вызвать этот код по следующим строкам:

$ftp = new FtpNew("hostname");

$ftpSession = $ftp->login("username", "password");

if (!$ftpSession) die("Failed to connect.");

$errorList = $ftp->send_recursive_directory("/local/dir/", "/remote/dir/");
print_r($errorList);

$ftp->disconnect();

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

Класс, в который он включен:

<?php
//Thanks for iYETER on /723650/zagruzit-ves-katalog-cherez-php-ftp

class FtpNew {
private $connectionID;
private $ftpSession = false;
private $blackList = array('.', '..', 'Thumbs.db');
public function __construct($ftpHost = "") {
    if ($ftpHost != "") $this->connectionID = ftp_connect($ftpHost);
}

public function __destruct() {
    $this->disconnect();
}

public function connect($ftpHost) {     
    $this->disconnect();
    $this->connectionID = ftp_connect($ftpHost);
    return $this->connectionID;
}

public function login($ftpUser, $ftpPass) {
    if (!$this->connectionID) throw new Exception("Connection not established.", -1);
    $this->ftpSession = ftp_login($this->connectionID, $ftpUser, $ftpPass);
    return $this->ftpSession;
}

public function disconnect() {
    if (isset($this->connectionID)) {
        ftp_close($this->connectionID);
        unset($this->connectionID);
    }
}

public function send_recursive_directory($localPath, $remotePath) {
    return $this->recurse_directory($localPath, $localPath, $remotePath);
}

private function recurse_directory($rootPath, $localPath, $remotePath) {
    $errorList = array();
    if (!is_dir($localPath)) throw new Exception("Invalid directory: $localPath");
    chdir($localPath);
    $directory = opendir(".");
    while ($file = readdir($directory)) {
        if (in_array($file, $this->blackList)) continue;
        if (is_dir($file)) {
            $errorList["$remotePath/$file"] = $this->make_directory("$remotePath/$file");
            $errorList[] = $this->recurse_directory($rootPath, "$localPath/$file", "$remotePath/$file");
            chdir($localPath);
        } else {
            $errorList["$remotePath/$file"] = $this->put_file("$localPath/$file", "$remotePath/$file");
        }
    }
    return $errorList;
}

public function make_directory($remotePath) {
    $error = "";
    try {
        ftp_mkdir($this->connectionID, $remotePath);
    } catch (Exception $e) {
        if ($e->getCode() == 2) $error = $e->getMessage(); 
    }
    return $error;
}

public function put_file($localPath, $remotePath) {
    $error = "";
    try {
        ftp_put($this->connectionID, $remotePath, $localPath, FTP_BINARY); 
    } catch (Exception $e) {
        if ($e->getCode() == 2) $error = $e->getMessage(); 
    }
    return $error;
}
}
1 голос
/ 29 мая 2009

Делайте это в цикле, просматривая все файлы в папке

$servername = $GLOBALS["servername"];
    $ftpUser = $GLOBALS["ftpUser"];
    $ftpPass = $GLOBALS["ftpPass"];
$conn_id = ftp_connect($servername) or die("<p style=\"color:red\">Error connecting to $servername </p>");

if(ftp_login($conn_id, $ftpUser, $ftpPass))
{
    $dir_handle = @opendir($path) or die("Error opening $path");

         while ($file = readdir($dir_handle)) {
            ftp_put($conn_id, PATH_TO_REMOTE_FILE, $file)
        }
}
0 голосов
/ 18 ноября 2011

Я его кодировал, скрипт загружает целую папку со своими подпапками и файлами.

Надеюсь, это поможет вам.

<?php 
ob_start(); 
set_time_limit(0); 
//r10.net fatal

$anadizin="uploadedeceginizdizin"; //this is the folder that you want to upload with all subfolder and files of it.

$ftpsunucu="domain.com"; //ftp domain name
$ftpusername="ftpuser";  //ftp user name 
$ftppass="ftppass"; //ftp passowrd
$ftpdizin="/public_html"; //ftp main folder





$arkadaslarlabardaydik = ftp_connect($ftpsunucu); 
$ictikguldukeglendik = ftp_login($arkadaslarlabardaydik, $ftpusername, $ftppass); 

if((!$arkadaslarlabardaydik) || (!$ictikguldukeglendik))  
{ 
  echo "cant connect!"; 
  die(); 
} 


function klasoruoku($dizinadi) 
{ 
  global $nerdeyiz,$fulldizin,$ftpdizin,$arkadaslarlabardaydik,$ftpdizin; 

  chdir($dizinadi."\\"); 
  $dizin = opendir("."); 

  while($bilgi=readdir($dizin))  
  { 
    if ($bilgi!='.' and $bilgi!='..' and $bilgi!="Thumbs.db") 
    {  
        $tamyol="$dizinadi\\$bilgi"; 

        $lokalkla=str_replace("".$nerdeyiz."\\","",$dizinadi).""; 
        $lokaldosya="$lokalkla\\$bilgi"; 
        $ftpyeyolla=str_replace(array("\\\\","\\"),array("/","/"),"$ftpdizin\\".str_replace("".$fulldizin."","",$dizinadi)."\\$bilgi"); 

        if(!is_dir($bilgi)) 
        { 
          $yükleme = ftp_put($arkadaslarlabardaydik, $ftpyeyolla, $tamyol, FTP_BINARY); 

          if (!$yükleme)  
          { 
              echo "$lokaldosya <font color=red>uploaded</font>"; echo "<br>";  fls(); 
          }  
          else  
          { 
              echo "$lokaldosya <font color=green>not uploaded</font>"; echo "<br>"; fls(); 
          } 
        } 
        else 
        {  
          ftp_mkdir($arkadaslarlabardaydik, $ftpyeyolla); 
          klasoruoku("$dizinadi\\$bilgi"); 
          chdir($dizinadi."\\"); 
          fls(); 
        } 
    } 
  } 
  closedir ($dizin); 
} 

function fls() 
{ 
    ob_end_flush(); 
    ob_flush(); 
    flush(); 
    ob_start(); 
} 

$nerdeyiz=getcwd(); 
$fulldizin=$nerdeyiz."\\$anadizin"; 
klasoruoku($fulldizin); 
ftp_close($arkadaslarlabardaydik); 

?>
0 голосов
/ 29 мая 2009

Если вы хотите загружать несколько файлов одновременно, вам нужно использовать thread или fork.

Я не уверен в внедрении Thread в PHP, но вы должны взглянуть на PHP SPL и / или PEAR

Редактировать: Спасибо Фрэнку Фармеру, который сообщил мне, что в PHP была функция fork (), известная как pcntl_fork ()

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

...