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でアップロードすることに成功しましたか?例をいただければ幸いです。
ありがとう
上記の方法(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 を使用して試すこともできます
個人的に、私は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);
?>
PECL拡張機能よりもphpseclibで気に入っている大きな点の1つは、移植性があることです。たぶん、PECL拡張機能はLinuxのあるバージョンで動作しますが、別のバージョンでは動作しません。また、共有ホストではほとんどインストールされないため、ほとんど機能しません。
phpseclibも、驚くべきことに faster です。また、ファイルがアップロードされたことを確認する必要がある場合は、phpseclibの組み込みログを証拠として使用できます。
私にとってこれはうまくいきました:
$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
phpseclibの単純なドキュメントの場合、純粋なPHP SFTP実装)。
次のリンクを参照してください:
フォルダー構造:
Main Folder->
my-files(Contain File Which Transfer To Remote Server)
phpseclib0.3.0
sftp.php
さらに入力を共有すると、Linux(64ビット)からWindows(32ビット)にファイルをコピーするときにssh2_scp_sendが正しくコピーされない(バイトが異なる)ことがわかり、sftpルーチンが完全に機能しました。 Windowsでstfpを使用している場合、C:\ to\pathの場合のパスは、WindowsボックスでSSHにCygwinが使用されている場合、ssh2.sftp:// {$ resSFTP}/cygdrive/c/to/pathとして配置する必要があります。 。