Загрузка PHP с удаленного сервера через sftp

Возможно, это было задано раньше, я новичок в PHP, и я стараюсь учиться как можно больше, но это действительно меня бросило.

В принципе, я хочу знать, как бы я использовал PHP-код, чтобы заставить его загружать все с удаленного сервера на локальное. Это заставляет загружать все не только один файл, на который я застрял. Так, пожалуйста, может кто-нибудь показать / объяснить мне, как я это сделаю?

Заранее спасибо.

Что я до сих пор

<?php $connection - ssh2_connect('example.com', 22); ssh2_auth_password($connection, 'username', 'password'); $remote_dir="/remote_dir/"; $local_dir="/local_dir/"; $remote ="$remote_dir"; $stream = ssh2_exec($connection, $remote); stream_set_blocking($stream,true); $command=fread($stream,4096); $array=explode(\n,$command); $total_files=sizeof($array); for($i=0;$i<$total_files;$i+++){ $file_name=trim($array[$i]); if($file_name!=''{ $remote_file=$remote_dir.$file_name; $local_file=$local_dir.$file_name; if(ssh2_scp_recv($connection, $remote_file,$local_file)){ echo "File ".$file_name." was copied to $local_dir<br />"; } } } fclose($stream); ?> 

Я думаю, что мой $ remote = "$ remote_dir"; неверно, и, честно говоря, у меня есть $ filename, когда я хочу весь каталог, это все, что у меня есть до сих пор.

Вот небольшой код о том, как читать папку и загружать все ее файлы:

 <?php $host = 'localhost'; $port = 22; $username = 'username'; $password = 'password'; $remoteDir = '/must/be/the/complete/folder/path'; $localDir = '/can/be/the/relative/or/absolute/local/path'; if (!function_exists("ssh2_connect")) die('Function ssh2_connect not found, you cannot use ssh2 here'); if (!$connection = ssh2_connect($host, $port)) die('Unable to connect'); if (!ssh2_auth_password($connection, $username, $password)) die('Unable to authenticate.'); if (!$stream = ssh2_sftp($connection)) die('Unable to create a stream.'); if (!$dir = opendir("ssh2.sftp://{$stream}{$remoteDir}")) die('Could not open the directory'); $files = array(); while (false !== ($file = readdir($dir))) { if ($file == "." || $file == "..") continue; $files[] = $file; } foreach ($files as $file) { echo "Copying file: $file\n"; if (!$remote = @fopen("ssh2.sftp://{$stream}/{$remoteDir}{$file}", 'r')) { echo "Unable to open remote file: $file\n"; continue; } if (!$local = @fopen($localDir . $file, 'w')) { echo "Unable to create local file: $file\n"; continue; } $read = 0; $filesize = filesize("ssh2.sftp://{$stream}/{$remoteDir}{$file}"); while ($read < $filesize && ($buffer = fread($remote, $filesize - $read))) { $read += strlen($buffer); if (fwrite($local, $buffer) === FALSE) { echo "Unable to write to local file: $file\n"; break; } } fclose($local); fclose($remote); } 

Вы также можете возобновить этот код (он не будет копировать каталоги) :

 while (false !== ($file = readdir($dirHandle))) { if ($file == "." || $file == "..") continue; echo "Copying file: $file\n"; if(!ssh2_scp_recv($connection, $remoteDir . $file, $localDir . $file)) echo "Could not download: ", $remoteDir, $file, "\n"; } 

Если вы не используете полный путь в удаленной папке, он не будет работать:

 opendir("ssh2.sftp://{$stream}{$remoteDir}") 

Обновление: я был любезно исправлен, что это не использует sftp, но вместо этого использует ftps. Вот ссылка Stackoverflow, обсуждающая использование PHP для SFTP .

Документы PHP уже покрывают большую часть того, что вам нужно для этого. Ниже приведен пример получения списка содержимого в удаленном каталоге:

 <?php // set up basic connection $ftp_server = "example.com"; $conn_id = ftp_ssl_connect($ftp_server); // login with username and password $ftp_user_name = "myuser"; $ftp_user_pass = "mypass"; $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); ftp_pasv($conn_id, true); // check connection if ((!$conn_id) || (!$login_result)) { echo "FTP connection has failed!"; echo "Attempted to connect to $ftp_server for user $ftp_user_name"; exit; } else { echo "Connected to $ftp_server, for user $ftp_user_name"; } $buff = ftp_rawlist($conn_id, '.'); var_dump($buff); ftp_close($conn_id); ?>