Загрузка файлов с помощью SFTP
Я успешно загрузил файлы поверх ftp, но теперь мне нужно делать через SFTP. Я могу успешно подключиться к удаленному серверу, создать файл и записать его, но я не могу загрузить существующий файл с локального сервера на удаленный сервер. Не работает ли ftp_put с подключением sftp?
Мой код, используемый для записи файла:
//Send file via sftp to server
$strServer = "*****";
$strServerPort = "****";
$strServerUsername = "*****";
$strServerPassword = "*****";
$csv_filename = "Test_File.csv";
//connect to server
$resConnection = ssh2_connect($strServer, $strServerPort);
if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)){
//Initialize SFTP subsystem
echo "connected";
$resSFTP = ssh2_sftp($resConnection);
$resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w');
fwrite($resFile, "Testing");
fclose($resFile);
}else{
echo "Unable to authenticate on server";
}
Кто-нибудь имел успех в захвате локального файла и загрузке с помощью метода, такого как выше, с помощью sftp? В качестве примера мы будем благодарны.
Спасибо
Ответы
Ответ 1
С помощью метода выше (с участием sftp) вы можете использовать stream_copy_to_stream:
$resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w');
$srcFile = fopen("/home/myusername/".$csv_filename, 'r');
$writtenBytes = stream_copy_to_stream($srcFile, $resFile);
fclose($resFile);
fclose($srcFile);
Вы также можете попробовать ssh2_scp_send
Ответ 2
Лично я предпочитаю избегать расширения PECL SSH2. Мой предпочтительный подход включает phpseclib, чистую реализацию PHP SFTP. например.
<?php
include('Net/SFTP.php');
$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
exit('Login Failed');
}
$sftp->put('remote.ext', 'local.ext', NET_SFTP_LOCAL_FILE);
?>
Одна из больших вещей, которые мне нравятся в phpclib над расширением PECL, - это то, что оно переносимо. Возможно, расширение PECL работает с одной версией Linux, но не с другим. И на общих хостах он почти никогда не работает, потому что он почти никогда не устанавливался.
phpseclib также, на удивление, быстрее. И если вам нужно подтвердить, что загруженный файл вы можете использовать встроенный протокол phpseclib как доказательство.
Ответ 3
Для меня это сработало:
$connection = ssh2_connect($server, $serverPort);
if(ssh2_auth_password($connection, $serverUser, $serverPassword)){
echo "connected\n";
ssh2_scp_send($connection, "/path/to/local/".$file, "/path/to/remote/".$file);
echo "done\n";
} else {
echo "connection failed\n";
}
Сначала мне нужно было установить libssh2-php:
sudo apt-get install libssh2-php
Ответ 4
Для простого документа phpseclib, чистой реализации PHP SFTP.
Обратитесь к ссылке:
Загрузка файлов через SFTP с помощью PHP
Структура папки:
Main Folder->
my-files(Contain File Which Transfer To Remote Server)
phpseclib0.3.0
sftp.php
Ответ 5
Разделяя дополнительные входы, найдено, что ssh2_scp_send не копировался должным образом (байты были разными) при копировании файла из Linux (64-разрядная версия) в Windows (32 бит), там работала sftp. При использовании Windows с stfp путь в случае C:\to\path должен быть помещен как ssh2.sftp://{$ resSFTP}/cygdrive/c/to/path, если Cygwin используется для SSH в окне Windows.