這篇文章給大家分享的內容是PHP sftp實現的文件上傳與下載,有著一定的參考價值,有需要的朋友可以參考一下
最近開發一個與銀行合作的項目,需要上傳與下載檔案。對文件保密有一定要求,所以用了SFTP。但實際開發中,遇到了很多問題,網上找的教程與案例都不能用,也是千遍一律 的,複製來,複製去的。最後在不斷的調試後終於實現了PHP的檔案上傳與下載。現記錄下來,僅供參考。
1.檢查PHP版本,下載對應ssh2 擴充 https://windows.php.net/downloads/pecl/releases/ssh2/ ,具體安裝,麻煩網上搜尋一下。 phpinfo()檢查是否安裝好。安裝成功後,可以看到ssh2.
2. 網路上提供的上傳下截方法(相信你一定看過)
<·?·php //php环境中必须有ssh ·$strServer = "服务器ip";//服务器ip ·$strServerPort = "22";//端口号 ·$strServerUsername = "***";//用户名 ·$strServerPassword = "***";//密码 ·//connect to server ·$resConnection = ssh2_connect($strServer, $strServerPort); ·if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)){ ·//初始化 SFTP ·$resSFTP = ssh2_sftp($resConnection); ·echo $resSFTP; ·//下载文件 ·//1 ·$filename = 'D:\down'.time().'.txt'; ·$opts = array( ·'http'=>array( ·'method'=>"GET", ·'timeout'=>60, ·) ·); ·$context = stream_context_create($opts); ·$strData = ·file_get_contents("ssh2.sftp://{$resSFTP}/var/testfile/abc.txt", false, $context); ·file_put_contents($filename, $strData); ·//2 也可以用copy() ·//if(!copy("ssh2.sftp://{$resSFTP}/dfr508/WUN/ikea-logo.jpg", $filename)) { ·// echo 'download failed'; ·//} ·//-------------------------------------------------------------------------------------------------------------- ·//上传文件 ·//1 ·//file_put_contents("ssh2.sftp://{$resSFTP}/var/testfile/456.txt", 'D:/ab.txt'); ·//2也可以用copy() ·if(!copy("d:/ab.txt", "ssh2.sftp://{$resSFTP}/var/testfile/up".time().".txt")) { ·echo 'upload failed'; ·} ·} else { ·echo "无法在服务器进行身份验证"; ·} ·?·>
但是我自己依照網路上的教程,怎麼也實現不了,最後只好一步步排查原因。
$strServer = "";//服务器ip $strServerPort = "";//端口号 $strServerUsername = "";//用户名 $strServerPassword = "";//密码 //1连接服务器 $resConnection = ssh2_connect($strServer, $strServerPort); //2验证连 if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)){ //3初始化 SFTP $resSFTP = ssh2_sftp($resConnection);
首先前面3步驟是沒有問題的
用copy ,file_get_content ,curl 方法實作上傳下載都 報502錯誤 。檢查了路徑等問題,也沒問題 ,但就是不能成功。
後面推論sftp伺服器上的檔案位址不能存取。
"ssh2.sftp://{$resSFTP}/var/testfile/abc.txt"
現在只有找到真正可用的地址才行,查看了很多資料,最後在PHP手冊上找到了
會報錯,說明這個位址是錯的。最後檢查出上傳,下載位址不需要加上前面的
直接用SFTP檔案路徑。
上傳使用的函數也不能用 前面提到的 copy ,file_get_content ,curl
需要用
ssh2_scp_send
######ssh2_scp_recv 下載###以上是PHP+sftp 實作檔案的上傳與下載的詳細內容。更多資訊請關注PHP中文網其他相關文章!