2011-04-13 17 views
6

FTP ve PHP kullanarak uzaktaki bir bilgisayardan bir klasörü nasıl yükleyebilirim?PHP kullanarak FTP ile bir klasörün indirilmesi

Ben kullanıcı adı ve şifre ve İNDİRMEMENİZİ klasörü var ...

kopya()?

Bana bildirin, teşekkürler!

+0

sen http://stackoverflow.com/questions/2803955/how-to-download-folder-from-some-ftp-server-into-your-server-home-directory [bu] (kontrol ettin -ve G). – SIFE

cevap

12
<?php 
$ftp_server = "ftp.example.com"; 
$conn_id = ftp_connect ($ftp_server) 
    or die("Couldn't connect to $ftp_server"); 

$login_result = ftp_login($conn_id, "user", "pass"); 
if ((!$conn_id) || (!$login_result)) 
    die("FTP Connection Failed"); 

ftp_sync ("DirectoryToCopy"); // Use "." if you are in the current directory 

ftp_close($conn_id); 

// ftp_sync - Copy directory and file structure 
function ftp_sync ($dir) { 

    global $conn_id; 

    if ($dir != ".") { 
     if (ftp_chdir($conn_id, $dir) == false) { 
      echo ("Change Dir Failed: $dir<BR>\r\n"); 
      return; 
     } 
     if (!(is_dir($dir))) 
      mkdir($dir); 
     chdir ($dir); 
    } 

    $contents = ftp_nlist($conn_id, "."); 
    foreach ($contents as $file) { 

     if ($file == '.' || $file == '..') 
      continue; 

     if (@ftp_chdir($conn_id, $file)) { 
      ftp_chdir ($conn_id, ".."); 
      ftp_sync ($file); 
     } 
     else 
      ftp_get($conn_id, $file, $file, FTP_BINARY); 
    } 

    ftp_chdir ($conn_id, ".."); 
    chdir (".."); 

} 
?> 

Kaynak: http://www.php.net/manual/es/function.ftp-get.php#90910

1

Bu choises sahip :

  • ftp sarıcı:

    $handle = opendir('ftp://user:[email protected]/path/to/dir') || die(); 
    
    while (false !== ($file = readdir($handle))) { 
        if(is_file($file)){ 
        $c = file_get_contents($file); 
        file_put_contents('/local/'.basename($file), $c); 
        } 
    } 
    
    closedir($handle); 
    
  • $c = ftp_connect('picasse.com'); 
    ftp_login($c, 'file', 'password'); 
    ftp_chdir($c, '/remote/dir'); 
    $contents = ftp_nlist($c, '-la .'); 
    foreach($contents as $line){ 
        $file = preg_split('@\[email protected]', trim($line)); 
        $name = $file[8]; 
        $size = $file[4]; 
        $mode = $file[0]; 
        if(substr($mode, 0, 1) == '-'){ 
        //file 
        $fd = fopen('/local/path/'.$name, 'w'); 
        ftp_fget ($c, $fd, $name, FTP_BINARY); 
        fclose($fd); 
        }else{ 
        //dir 
        } 
    } 
    
  • kullanımı dış program wget benzeri veya

    • wget --recursive [seçenekleri lftp php ftp uzantısı kullanılarak ] ftp://user:[email protected]/ # bkz. Wge t --help
    • lftp -c commands_file commands_file gibi bir şey olurdu #: Sadece böyle şeyler yapmak 2 yeni kütüphaneler sunduk

      connect user:[email protected] 
      mget /path/to/remote /path/to/local 
      
0

01 (local_path aksi klasörün kendisini yüklemek eğik çizgi yükleme klasörü içeriği ile sona ererse) FTP/ SFTP

yinelemeli uzak SFTP sunucudaki dosyaları ve klasörleri kopyalamak

Ftp::upload_dir($server, $user, $password, $local_path, $remote_path, $port = 22); 

İndir uzak FTP sunucusundan bir dizin (remote_dir eğik çizgi indir klasör içeriği ile sona ererse aksi klasörün kendisini indirmek)

Ftp::download_dir($server, $user, $password, $remote_dir, $local_dir, 

$ portu = 22); kodu için

işte burada ama küçük uygulamalar fonksiyonları bağımlılıkları için tüm sınıf gerekecektir.

/** 
* Download a directory from remote FTP server 
* 
* If remote_dir ends with a slash download folder content 
* otherwise download folder itself 
* 
* @param string $server 
* @param string $user 
* @param string $password 
* @param string $remote_dir 
* @param string $local_dir 
* @param int $port 
* 
* @return bool $downloaded 
* 
*/ 
public static function download_dir($server, $user, $password, $remote_dir, $local_dir, $port = 21) 
{ 
    $downloaded = false; 
    try 
    { 
     if(is_dir($local_dir) && is_writable($local_dir)) 
     { 
      if(false !== $cid = Ftp::login($server, $user, $password, $port)) 
      { 
       # If remote_dir do not ends with/
       if(!HString::ends_with($remote_dir, '/')) 
       { 
        # Create fisrt level directory on local filesystem 
        $local_dir = rtrim($local_dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . basename($remote_dir); 
        mkdir($local_dir); 
       } 

       # Remove trailing slash 
       $local_dir = rtrim($local_dir, DIRECTORY_SEPARATOR); 
       $downloaded = Ftp::download_all($cid, $remote_dir, $local_dir); 
       ftp_close($cid); 
      } 
     } 
     else 
     { 
      throw new Exception("Local directory does not exist or is not writable", 1); 
     } 
    } 
    catch(Exception $e) 
    { 
     error_log("Ftp::download_dir : " . $e->getMessage()); 
    } 
    return $downloaded; 
} 
/** 
* Recursive function to download remote files 
* 
* @param ressource $cid 
* @param string $remote_dir 
* @param string $local_dir 
* 
* @return bool $download_all 
* 
*/ 
private static function download_all($cid, $remote_dir, $local_dir) 
{ 
    $download_all = false; 
    try 
    { 
     if(Ftp::is_dir($remote_dir, $cid)) 
     { 
      $files = ftp_nlist($cid, $remote_dir); 
      if($files!==false) 
      { 
       $to_download = 0; 
       $downloaded = 0; 
       # do this for each file in the remote directory 
       foreach ($files as $file) 
       { 
        # To prevent an infinite loop 
        if ($file != "." && $file != "..") 
        { 
         $to_download++; 
         # do the following if it is a directory 
         if (Ftp::is_dir($file, $cid))// $remote_dir . DIRECTORY_SEPARATOR . 
         {         
          # Create directory on local filesystem 
          mkdir($local_dir . DIRECTORY_SEPARATOR . basename($file)); 

          # Recursive part 
          if(Ftp::download_all($cid, $file, $local_dir . DIRECTORY_SEPARATOR . basename($file))) 
          { 
           $downloaded++; 
          } 
         } 
         else 
         { 
          # Download files 
          if(ftp_get($cid, $local_dir . DIRECTORY_SEPARATOR . basename($file), $file, FTP_BINARY)) 
          { 
           $downloaded++; 
          } 
         } 
        } 
       } 
       # Check all files and folders have been downloaded 
       if($to_download===$downloaded) 
       { 
        $download_all = true; 
       } 
      } 
     } 
    } 
    catch(Exception $e) 
    { 
     error_log("Ftp::download_all : " . $e->getMessage()); 
    } 
    return $download_all; 
}