6
votes

Télécharger un dossier avec FTP en utilisant php

Comment puis-je télécharger un dossier d'un hôte distant à l'aide de FTP et de PHP?

J'ai le nom d'utilisateur et le mot de passe et le dossier à télécharger ... copier ()?

Faites-moi savoir, merci!


1 commentaires

Avez-vous vérifié Ceci .


5 Réponses :




4
votes

Vous avez ces choix:

  • wrapper FTP: p>

    connect user:password@ftp.host.com
    mget /path/to/remote /path/to/local
    
  • Utilisation de l'extension FTP de PHP P>

    $c = ftp_connect('host.com');
    ftp_login($c, 'file', 'password');
    ftp_chdir($c, '/remote/dir');
    $contents = ftp_nlist($c, '-la .');
    foreach($contents as $line){
      $file = preg_split('@\s+@', 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
      }
    }
    
  • Utilisez un programme externe comme wget ou lftp p>

    • wget --Recursive [options] ftp: // utilisateur: mot de passe @ host / # Voir wget --Help li>
    • LFTP -C Commands.txt # Où Commands.txt serait quelque chose comme: p>

      $handle = opendir('ftp://user:password@host/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);
      


0 commentaires

1
votes

Je viens de publier deux nouvelles bibliothèques pour faire de telles choses dans FTP et SFTP .

Copie récursivement des fichiers et des dossiers sur le serveur SFTP distant (si local_Path se termine par un téléchargement SLASH Contenu de dossier Sinon, téléchargez le dossier lui-même) p> xxx pré>

Téléchargez un répertoire à partir de serveur FTP distant (si Remote_Dir se termine par un contenu de dossier de téléchargement SLASH Télécharger le dossier) P>

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


2 commentaires

Erreur fatale: Erreur non capturée: Classe 'Hug \ Hstring \ Hstring' non trouvé


@BHAVESHPRAJAPATI Vous ne devez pas copier / coller le code ci-dessus, mais l'installer via le compositeur comme décrit dans le référentiel de bibliothèque pour installer également des dépendances ...



2
votes

fonction améliorée de @Treffynnon

  • amélioré car ftp_chdir () prend beaucoup de temps lorsque vous avez plus de 100 fichiers dans le dossier
  • transférera des fichiers cachés comme .htaccess
  • ne copiera que si nécessaire (des chèques existent et la dernière modification)
    xxx

0 commentaires