ftp_get

(PHP 4, PHP 5, PHP 7)

ftp_getЗагружает файл с FTP-сервера

Описание

bool ftp_get ( resource $ftp_stream , string $local_file , string $remote_file , int $mode [, int $resumepos = 0 ] )

ftp_get() загружает удалённый файл с FTP-сервера и сохраняет его локально.

Список параметров

ftp_stream

Идентификатор соединения с FTP сервером.

local_file

Путь к локальному файлу (файл будет перезаписан, если уже существует).

remote_file

Путь к удалённому файлу.

mode

Режим передачи. Должен быть либо FTP_ASCII, либо FTP_BINARY.

resumepos

Позиция начала загрузки в удаленном файле.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примеры

Пример #1 Пример использования ftp_get()

<?php

// объявление переменных
$local_file 'local.zip';
$server_file 'server.zip';

// установка соединения
$conn_id ftp_connect($ftp_server);

// вход с именем пользователя и паролем
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass);

// попытка скачать $server_file и сохранить в $local_file
if (ftp_get($conn_id$local_file$server_fileFTP_BINARY)) {
    echo 
"Произведена запись в $local_file\n";
} else {
    echo 
"Не удалось завершить операцию\n";
}

// закрытие соединения
ftp_close($conn_id);

?>

Смотрите также

  • ftp_pasv() - Включает или выключает пассивный режим
  • ftp_fget() - Скачивает файл с FTP-сервера и сохраняет его в предварительно открытом файле
  • ftp_nb_get() - Скачивает файл с FTP-сервера в асинхронном режиме и сохраняет его в локальный файл
  • ftp_nb_fget() - Скачивает файл с FTP сервера в асинхронном режиме и сохраняет его в предварительно открытом файле

Коментарии

Keep in mind that ftp_get will overwrite the file on your local machine if it has the same name.
2002-11-06 09:36:05
http://php5.kiev.ua/manual/ru/function.ftp-get.html
If you previously downloaded a file before (like a huge web log), and just want to get the remaining portion, do this:

$local_file_size = filesize($local_file_path);
$get_result = ftp_get($conn_id, $local_file_path, $remote_file_path, FTP_BINARY, $local_file_size);

This same code works regardless of wether the local file exists already or not.  You should first test to make sure the local file is not bigger than the remote file.
2003-11-22 16:25:53
http://php5.kiev.ua/manual/ru/function.ftp-get.html
The zero size file is not a side effect.  When the ftp_get starts the first thing it does is to create the inode/file which it will stream the data too and that is a zero size file with the nname you specified for the local file.  When the download fails it leaves the file in place.
2004-01-23 08:20:59
http://php5.kiev.ua/manual/ru/function.ftp-get.html
Hello everybody,

If someone will try to download files to the same local file (some temporary file), like shown here:

<?php
foreach ($files as $key=>$path) {
... 
 
$result ftp_get($ftpConnId'temp.tmp'$pathFTP_BINARY);
...
}
?>

please take in consideration the fact that you will have big problems with downloading (getting) hole files. In other words ‘temp.tmp’ file always will have the same size equal to first downloaded file despite the real size of downloading file. I have not idea what is the reason!

If someone will think that problem is just in getting proper file size (which you will get using filssize() function) he will be mistaken. The download file’s size is not equal to source file’s size materially, that means fflush() function will not solve the problem (I have tried this as well).

Finally the solution was founded: before downloading a file you will need to delete local file if such exist (‘temp.tmp’). So working code will look like:

<?php
foreach ($files as $key=>$path) {
... 
  if (
file_exists('temp.tmp')) {
   
unlink('temp.tmp');
  }
 
$result ftp_get($ftpConnId'temp.tmp'$pathFTP_BINARY);
...
}
?>

Good luck in scripting :-)

Vitali Simsive
2006-08-12 18:05:24
http://php5.kiev.ua/manual/ru/function.ftp-get.html
Why there isn't an "ftp_get_contents" function, I don't know. It takes a little work to emulate one, but it's doable.
<?php
function ftp_get_contents($ftp_stream$remote_file$mode$resume_pos=null){
   
$pipes=stream_socket_pair(STREAM_PF_UNIXSTREAM_SOCK_STREAMSTREAM_IPPROTO_IP);
    if(
$pipes===false) return false;
    if(!
stream_set_blocking($pipes[1], 0)){
       
fclose($pipes[0]); fclose($pipes[1]);
        return 
false;
    }
   
$fail=false;
   
$data='';
    if(
is_null($resume_pos)){
       
$ret=ftp_nb_fget($ftp_stream$pipes[0], $remote_file$mode);
    } else {
       
$ret=ftp_nb_fget($ftp_stream$pipes[0], $remote_file$mode$resume_pos);
    }
    while(
$ret==FTP_MOREDATA){
        while(!
$fail && !feof($pipes[1])){
           
$r=fread($pipes[1], 8192);
            if(
$r==='') break;
            if(
$r===false){ $fail=true; break; }
           
$data.=$r;
        }
       
$ret=ftp_nb_continue($ftp_stream);
    }
    while(!
$fail && !feof($pipes[1])){
       
$r=fread($pipes[1], 8192);
        if(
$r==='') break;
        if(
$r===false){ $fail=true; break; }
       
$data.=$r;
    }
   
fclose($pipes[0]); fclose($pipes[1]);
    if(
$fail || $ret!=FTP_FINISHED) return false;
    return 
$data;
}
?>

Something similar would work to write a ftp_put_contents function, too.
2007-01-25 11:50:00
http://php5.kiev.ua/manual/ru/function.ftp-get.html
Crud. The _nb_ only refers to reading from the ftp server, and the buffer in the socket pair is only about 364 bytes. So it doesn't work for files larger than that size.
2007-01-30 09:24:10
http://php5.kiev.ua/manual/ru/function.ftp-get.html
<?php
               
// define some variables
       
$folder_path "YOUR FOLDER PATH"
       
$local_file "LOCAL FILE PATH";
       
$server_file "SERVER FILE PATH";
       
       
//-- Connection Settings
       
$ftp_server "IP ADDRESS"// Address of FTP server.
       
$ftp_user_name "USERNAME"// Username
       
$ftp_user_pass "PASSWORD"// Password
        #$destination_file = "FILEPATH"; 
       
        // set up basic connection
       
$conn_id ftp_connect($ftp_server);
       
       
// login with username and password
       
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass);
       
       
// try to download $server_file and save to $local_file
       
if (ftp_get($conn_id$local_file$server_fileFTP_BINARY)) {
            echo 
"Successfully written to $local_file\n";
        } else {
            echo 
"There was a problem\n";
        }
       
       
// close the connection
       
ftp_close($conn_id);
?>
2008-03-25 05:40:21
http://php5.kiev.ua/manual/ru/function.ftp-get.html
Here's a quick function that figures out the correct mode to use based on a file's extension.

<?php
function get_ftp_mode($file)
{   
   
$path_parts pathinfo($file);
   
    if (!isset(
$path_parts['extension'])) return FTP_BINARY;
    switch (
strtolower($path_parts['extension'])) {
        case 
'am':case 'asp':case 'bat':case 'c':case 'cfm':case 'cgi':case 'conf':
        case 
'cpp':case 'css':case 'dhtml':case 'diz':case 'h':case 'hpp':case 'htm':
        case 
'html':case 'in':case 'inc':case 'js':case 'm4':case 'mak':case 'nfs':
        case 
'nsi':case 'pas':case 'patch':case 'php':case 'php3':case 'php4':case 'php5':
        case 
'phtml':case 'pl':case 'po':case 'py':case 'qmail':case 'sh':case 'shtml':
        case 
'sql':case 'tcl':case 'tpl':case 'txt':case 'vbs':case 'xml':case 'xrc':
            return 
FTP_ASCII;
    }
    return 
FTP_BINARY;
}

// sample usage
ftp_get($conn_id$local_file$server_fileget_ftp_mode($server_file));
?>
2008-10-22 17:12:21
http://php5.kiev.ua/manual/ru/function.ftp-get.html
ftp_sync is a way to walk the directory structure on the server and copy every directory and file to the same location locally.

<?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$fileFTP_BINARY);
    }
       
   
ftp_chdir ($conn_id"..");
   
chdir ("..");

}
?>
2009-05-15 15:42:37
http://php5.kiev.ua/manual/ru/function.ftp-get.html
Автор:
I tried to ftp a 7mb file today off my webserver.

I copied this example directly and it told me.

Port command successful
"there was a problem"

I thought it was because of the size.
But I guessed it might be cause of my firewall.

So I made the ftp connection passive:

<?PHP
 
 
...
 
$login_result ftp_login($conn_id$ftp_user_name$ftp_user_pass);
 
ftp_pasv($conn_idtrue);

?>

Ran the script again & it worked fine.

Hope this helps someone
2009-10-22 22:50:20
http://php5.kiev.ua/manual/ru/function.ftp-get.html
If you ran the example and see that it fail after 90sec (timeout).

Then try adding:
<?php
ftp_pasv
($ftp_conntrue);
?>
2012-12-23 11:32:24
http://php5.kiev.ua/manual/ru/function.ftp-get.html
Don't want to use an intermediate file?  Use 'php://output' as the filename and then capture the output using output buffering.

ob_start();
$result = ftp_get($ftp, "php://output", $file, FTP_BINARY);
$data = ob_get_contents();
ob_end_clean();

Don't forget to check $result to make sure there wasn't an error.  After that, manipulate the $data variable however you want.
2013-04-03 20:50:01
http://php5.kiev.ua/manual/ru/function.ftp-get.html
I'd suggest use ftp_fget() instead of ftp_get() since the latter only return TRUE or FALSE and there's no obvious way to get the cause of failure.

   Using ftp_fget,  you have to pass a file handle as local file, so you have to do fopen() first. By way of this, you can find 'Permission Denied' problem when call fopen(). If you use ftp_get(), there's no way to find this error cause.

   In my case, I run httpd using 'nobody' and I create ftp local folder using 'haha'. It tooks me long time to find the 'Permission Denied' problem at that time since  I use ftp_get() then.
2016-08-30 10:23:41
http://php5.kiev.ua/manual/ru/function.ftp-get.html
Note that PHP still defaults to FTP active mode by default, which is almost never used anymore since the creation of firewalls.   Don't forget to add a ftp_pasv($conn, true) after your ftp_login.
2018-07-26 23:06:16
http://php5.kiev.ua/manual/ru/function.ftp-get.html

    Поддержать сайт на родительском проекте КГБ