Загрузка файлов с ftp-сервера на PHP

#php

#php

Вопрос:

Я использую следующий формат в коде php для загрузки файлов с ftp-сервера.

 file_put_contents(
            $filePath.$fileName, file_get_contents(
                ftp://username:password@server_name/folder_name/xyz#123.csv.zip
            )
);    
  

Я получаю ошибку 550, поскольку имя файла содержит ‘#’. Как избежать ошибки. Кроме того, какой класс PHP является лучшим для выполнения различных операций на FTP?

Комментарии:

1. Вы на 1000% уверены, что получите 550 из-за символа в имени файла?

2. Обычно вы получаете ошибку 550, когда вы не авторизованы. Вы проверили правильность вашего имени пользователя и пароля?

3. Почему бы не использовать функцию ftp и ftp_login? — php.net/manual/en/ref.ftp.php

4. да, из-за # в имени файла это вызывает проблему. я протестировал файл без #, и он работает.

Ответ №1:

Используйте это

 <?php

// define some variables
$local_file = 'filename.jpg';
$server_file = 'filename.jpg';
$ftp_server="www.abc.com";
$ftp_user_name="username";
$ftp_user_pass="password";

$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_file, FTP_BINARY)) {
    echo "Successfully written to $local_filen";
}
else {
    echo "There was a problemn";
}
// close the connection
ftp_close($conn_id);

?>
  

Комментарии:

1. Hii .. я попытался реализовать то же самое, но это не работает.. помогите мне!!

2. Я пытаюсь реализовать код, и я получаю эту ошибку: Предупреждение: ftp_get(): Недопустимая команда ПОРТА.

3. создание пустого файла. размер равен нулю.

4. @user2728024 Если вы обнаружите, что получаете ошибки «Недопустимая команда ПОРТА», вы можете попробовать включить пассивный режим.

Ответ №2:

 true == (
$data = @
    file_get_contents('ftp://username:password@server_name/folder_name/xyz#123.csv')
    )
        ?
    file_put_contents('xyz#123.csv', $data)
        :
    exit;
  

Ответ №3:

Загружайте все файлы с оригинальными одинаковыми именами с FTP-сервера и сохраняйте на локальном

 <?php
//Download All files with original same name from FTP server and save to local server using PHP 8.1
error_reporting(E_ALL);
 
$localFilePath = "/home/public_html/media/import/";
 
$ftp_server = "xxx"; 
$ftp_user_name = "xx"; 
$ftp_user_pass = "xxx";

$start_time = microtime(true);
 

function download($ftp,$directory,$localFilePath) {
    if (ftp_chdir($ftp, $directory)) {
        echo "Current directory is now: " . ftp_pwd($ftp) . "n";
    } else { 
        echo "Couldn't change directoryn";
    }
    
    $fileContents = ftp_nlist($ftp, ftp_pwd($ftp));
    if(!$fileContents) {
        die(' no directory found');
    }
    $toReplace='/'.$directory.'/';
    foreach ($fileContents as $key => $fileName) {
         
        //echo $fileName; echo PHP_EOL;
        $onlyFileName = str_replace($toReplace,'',$fileName);
        echo $onlyFileName; echo PHP_EOL;
        
        $localFile = $localFilePath.$onlyFileName;
        
        //Target only file names which names are having only `-full` in it.
        if (strpos($onlyFileName, '-full') !== false) {
            if(ftp_get($ftp, $localFile, $fileName, FTP_BINARY)){
                echo "Successfully written to $localFile"; echo PHP_EOL;
            } else {
                echo "There was an issue"; echo PHP_EOL;
            }
        }
    }
}

try{
    $ftp = ftp_connect($ftp_server) or die('Could not connect to FTP server.');
    $login_result = ftp_login($ftp, $ftp_user_name, $ftp_user_pass);
    if (!$login_result) { 
        die('Could not log in to FTP account.');
    }
    ftp_pasv($ftp, true);
    
    //pass directory name taken from FTP server, in this case it's 'images'
    download($ftp,'images',$localFilePath);
    
    echo PHP_EOL;
    ftp_close($ftp);
    $execution_time = ();
    echo " Execution time of script = ".(microtime(true) - $start_time)." sec";
    echo PHP_EOL;
} catch(Exception $e){
    print_r($e->getMessage());
}
 
  

Ответ №4:

Попробуйте:

 $output = exec("wget -N ftp://username@ftp.server.com/path/to directory/file 2>amp;1 |grep 'filename w/o extension'|grep -v ftp|grep -v =");
print $output <to check if file downloaded or not>
  

Комментарии:

1. Плохая практика делать что-то в командной оболочке, что PHP может сделать самостоятельно. Плюс тот факт, что выполнение командной строки отключено на большинстве хостинг-провайдеров по соображениям безопасности.