2011-04-13 21 views
6

¿Cómo puedo descargar una carpeta desde un host remoto usando FTP y PHP?Descargando una carpeta mediante FTP usando PHP

tengo nombre de usuario y la contraseña y la carpeta a donwload ...

copia()?

¡Avísame, gracias!

+0

¿verificó [esto] (http://stackoverflow.com/questions/2803955/how-to-download-folder-from-some-ftp-server-into-your-server-home-directory -y G). – SIFE

Respuesta

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 (".."); 

} 
?> 

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

1

Tienes estos Oferta de :

  • ftp envoltorio:

    $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); 
    
  • usando la extensión ftp de php

    $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 
        } 
    } 
    
  • uso del programa externo como wget o LFTP

0

He acaba de lanzar 2 nuevas bibliotecas para hacer tales cosas en FTP/SFTP

copiar recursivamente los archivos y carpetas en el servidor SFTP remoto (Si local_path termina con un contenido de carpeta de carga de roza lo contrario subir propia carpeta)

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

Descargar un directorio del servidor FTP remoto (Si dir_remoto termina con un contenido de carpeta de descarga barra de otro modo la carpeta de descarga en sí)

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

puerto $ = 22);

Para el código aquí lo es, pero necesitará toda la clase para las dependencias de las funciones pequeñas.

/** 
* 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; 
} 
Cuestiones relacionadas