Php - ftp_get - Warning: ftp_get (): opening a data connection in BINARY mode

I am trying to write a script that will download files from an FTP server. They are all quite large (about 2 GB each). The script starts, but eventually ends with the above error. Is this related to size? Is there any way around this? Here is the code:

<?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('Ym-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); } ?> 
+4
source share
5 answers

Are you sure every file is binary?

You can try to guess the file type from your extension in order to configure the download mode, as suggested in this comment: http://www.php.net/manual/fr/function.ftp-get.php#86516

0
source

I had a similar problem and using the following was resolved for me.

 ftp_pasv($conn_id, TRUE); 
+13
source

For those who may come on this issue because he has the same problem. For me it was quite simple, the destination location for the download did not have enough free space for the file.

+5
source

Try increasing FTP_TIMEOUT (default is 90)

 ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 180); 

It worked great for me.

http://www.php.net/manual/en/function.ftp-set-option.php

+2
source

Try using ftp_close and ftp_connect as reset your FTP connection.

I spent a good day on this, trying to find everything I could find (ftp_pasv, ftp_alloc, switching to FTP_ASCII / FTP_BINARY), without success.

Some servers have limits on how much you can load per session.

0
source

Source: https://habr.com/ru/post/1304821/


All Articles