首頁  >  文章  >  後端開發  >  PHP 連接sftp 實作檔案上傳與下載

PHP 連接sftp 實作檔案上傳與下載

不言
不言原創
2018-04-16 10:07:142299瀏覽

這篇文章介紹的內容是關於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 = &#39;D:\down&#39;.time().&#39;.txt&#39;;
·$opts = array(
·&#39;http&#39;=>array(
·&#39;method&#39;=>"GET",
·&#39;timeout&#39;=>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 &#39;download failed&#39;;
·//}
·//--------------------------------------------------------------------------------------------------------------
·//上传文件
·//1
·//file_put_contents("ssh2.sftp://{$resSFTP}/var/testfile/456.txt", &#39;D:/ab.txt&#39;);
·//2也可以用copy()
·if(!copy("d:/ab.txt", "ssh2.sftp://{$resSFTP}/var/testfile/up".time().".txt")) {
·echo &#39;upload failed&#39;;
·}
·} 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手冊上找到了


ssh2_sftp_realpath  檢查檔案真實路徑,最後返回連接上SFTP後存取檔案的位址。傳入"ssh2.sftp://{$resSFTP}/var/testfile/abc.txt" 

會報錯,說明這個位址是錯的。最後檢查出上傳,下載位址不需要加上前面的  

sh2.sftp://{$resSFTP}

直接用SFTP檔案路徑。

上傳使用的函數也不能用  前面提到的  copy ,file_get_content ,curl 

需要用    

ssh2_scp_send    

ssh2_scp_send   

ssh2_scp_recv  下載

相關推薦:

##PHP連接到mysql的方法-mysqli和PDO

PHP連線池詳解







######### ##############################

以上是PHP 連接sftp 實作檔案上傳與下載的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn