2010-03-22 4 views
4

J'essaye d'écrire un script qui téléchargera des fichiers à partir d'un serveur FTP. Ils sont tous assez gros (près de 2 Go chacun). Le script commence à s'exécuter, mais se termine finalement avec l'erreur ci-dessus. Est-ce lié à la taille? Y a-t-il un moyen de contourner ceci? Voici le code:php - ftp_get - Avertissement: ftp_get(): Ouverture de la connexion de données en mode BINAIRE

<?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, "USERNAME", "PASSWORD"); 
if ((!$conn_id) || (!$login_result)) die("FTP Connection Failed"); 
ftp_sync("download"); 
ftp_close($conn_id); 

$mkdir = date('Y-m-d'); 
mkdir('encrypted/'.$mkdir, 0777); 
smartCopy("./download/", 'encrypted/'.$mkdir); 
chmodr("encrypted/".$mkdir, 0777); 

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

} 

function chmodr($path, $filemode) { 
    if (!is_dir($path)) 
     return chmod($path, $filemode); 

    $dh = opendir($path); 
    while (($file = readdir($dh)) !== false) { 
     if($file != '.' && $file != '..') { 
      $fullpath = $path.'/'.$file; 
      if(is_link($fullpath)) 
       return FALSE; 
      elseif(!is_dir($fullpath) && !chmod($fullpath, $filemode)) 
        return FALSE; 
      elseif(!chmodr($fullpath, $filemode)) 
       return FALSE; 
     } 
    } 

    closedir($dh); 

    if(chmod($path, $filemode)) 
     return TRUE; 
    else 
     return FALSE; 
} 

function smartCopy($source, $dest, $folderPermission='0777',$filePermission='0777'){ 

    $result=false; 

    if (is_file($source)) { 
     if(is_dir($dest)) { 
      if ($dest[strlen($dest)-1]!='/') 
       $__dest=$dest."/"; 
      $__dest .= basename($source); 
      } 
     else { 
      $__dest=$dest; 
      } 
     $result=copy($source, $__dest); 
     chmod($__dest,$filePermission); 
     } 
    elseif(is_dir($source)) { 
     if(!is_dir($dest)) { 
      @mkdir($dest,$folderPermission); 
      chmod($dest,$folderPermission); 
      } 
     if ($source[strlen($source)-1]!='/') 
      $source=$source."/"; 
     if ($dest[strlen($dest)-1]!='/') 
      $dest=$dest."/"; 

     $return = true; 
     $dirHandle=opendir($source); 
     while($file=readdir($dirHandle)) { 
      if($file!="." && $file!="..") { 
       $result=smartCopy($source.$file, $dest.$file, $folderPermission, $filePermission); 
       } 
      } 
     closedir($dirHandle); 
     } 
    else { 
     $result=false; 
     } 
    return $result; 
} 

function deleteDirectory($dir) { 
    if (!file_exists($dir)) return true; 
    if (!is_dir($dir) || is_link($dir)) return unlink($dir); 
     foreach (scandir($dir) as $item) { 
      if ($item == '.' || $item == '..') continue; 
      if (!deleteDirectory($dir . "/" . $item)) { 
       chmod($dir . "/" . $item, 0777); 
       if (!deleteDirectory($dir . "/" . $item)) return false; 
      }; 
     } 
     return rmdir($dir); 
    } 
?> 

Répondre

5

Pour toute personne qui pourrait venir par cette question parce que d'avoir la même question. Pour moi, c'était plutôt simple, l'emplacement cible pour le téléchargement n'avait pas assez d'espace libre pour le fichier.

+0

On dirait un avertissement étrange pour cela, et je l'aurais prévu une erreur. –

+0

@Tomalak Je suis là avec vous. –

+0

C'était aussi mon problème. Merci! –

12

J'avais un problème semblable et en utilisant ce qui suit l'a résolu pour moi.

ftp_pasv($conn_id, TRUE); 
+1

Fonctionne pour moi! THX. –

+0

Fonctionne pour moi aussi. Merci beaucoup! –

0

Essayez d'utiliser ftp_close et ftp_connect pour réinitialiser votre connexion FTP.

J'ai passé une bonne journée sur celui-ci, en essayant tout ce que j'ai pu trouver (ftp_pasv, ftp_alloc, en changeant en FTP_ASCII/FTP_BINARY), sans succès.

Certains serveurs ont des limites sur combien vous pouvez télécharger par session.