2013-07-16 3 views
6

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

В принципе, я хочу знать, как бы я использовал 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_dir"; неверно, и, честно говоря, у меня есть $ filename, когда я хочу весь каталог, это все, что у меня есть до сих пор.

+3

Опубликовать то, что вы сделали до сих пор, и не забудьте заменить любую конфиденциальную информацию, если таковая имеется. – Prix

+0

Только что добавил, что у меня есть. как я сказал, я не знаю, правильно это или не только начал PHP несколько недель назад, но я, вероятно, над головой. – user2589167

+0

Опубликовали образец надежды, который вам нравится, поскольку вы новичок в Stackoverflow [** Я также рекомендую вам отправиться в Tour Stackoverflow, чтобы узнать, как наилучшим образом использовать этот сайт, который поможет вам в решении будущих вопросов **. ] (http://stackoverflow.com/about) – Prix

ответ

11

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

<?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}") 
+0

Ну, похоже, что я не был рядом с близким, спасибо за это – user2589167

+0

if (! $ Remote = @fopen ("ssh2.sftp: // {$ stream}/{$ remoteDir}/{$ file} ", 'r')) // замечать косую черту –

0

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

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

<?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); 
?> 
+0

Спасибо за быстрый ответ! Поэтому, используя это, я могу проверить список всего в каталоге, а использование ftp_ssl такое же, как с использованием SFTP? – user2589167

+0

Да. Это даст вам список всех файлов в каталоге, и вы используете SSL, который является SFTP –

+1

Нет, они не то же самое, SFTP - протокол передачи файлов SSH, а FTP через SSL также известен как FTP Secure и FTP-SSL, вот хорошая статья https://www.eldos.com/security/articles/4672.php – Prix

Смежные вопросы