2012-03-05 56 views
25

Tôi đã tải lên thành công tệp qua ftp, nhưng bây giờ tôi cần thực hiện qua SFTP. Tôi có thể kết nối thành công với máy chủ từ xa, tạo một tệp và ghi vào nó, nhưng tôi không thể tải lên tệp hiện có từ máy chủ cục bộ của mình lên máy chủ từ xa. Là ftp_put không bắn với một kết nối sftp?Tải tệp lên SFTP

Mã của tôi sử dụng để viết một tập tin:

//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"; 
} 

Có ai có bất kỳ thành công trong grabbing một tập tin cục bộ và tải lên thông qua một phương pháp như trên với sftp? Một ví dụ sẽ được đánh giá cao.

Cảm ơn

+0

Tại sao bạn gọi nó là 'resFile'? Tại sao "res"? Đối với những gì hiện nó đứng cho? – Black

+0

kết quả tôi đoán .. @Black – denns

Trả lời

35

Với phương pháp trên (liên quan đến sftp), bạn có thể sử dụng 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); 

Bạn cũng có thể thử sử dụng ssh2_scp_send

+1

Điều đó làm việc hoàn hảo, cảm ơn bạn. Tôi sẽ đánh dấu cho các dự án trong tương lai! – Marc

+0

Điều này thật tuyệt vời, nhưng đừng quên vô hiệu hóa thư mục cơ sở mở cho người dùng. –

13

Cá nhân, tôi thích tránh phần mở rộng PECL SSH2. Cách tiếp cận ưa thích của tôi liên quan đến phpseclib, a pure PHP SFTP implementation. ví dụ.

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

Một trong những điều lớn tôi thích về phpseclib trong phần mở rộng PECL là nó có thể di động. Có lẽ phần mở rộng PECL hoạt động trên một phiên bản của Linux nhưng không hoạt động trên một phiên bản khác. Và trên máy chủ chia sẻ, nó hầu như không bao giờ hoạt động vì nó hầu như không bao giờ được cài đặt.

phpseclib cũng đáng ngạc nhiên là faster. Và nếu bạn cần xác nhận rằng tệp đã tải lên, bạn có thể sử dụng ghi nhật ký dựng sẵn của phpseclib làm bằng chứng.

+0

Tôi đang tải lên một số tệp csv bằng cách sử dụng tập lệnh ở trên nhưng tôi nhận được lỗi sau: Thời gian thực thi tối đa 120 giây vượt quá trong Net \ SSH2.php trên dòng 3521, làm cách nào tôi có thể vượt quá nó. –

+0

Xem http: // php.net/set-time-limit. – neubert

1

Chia sẻ đầu vào tiếp theo, tìm thấy ssh2_scp_send không sao chép đúng (byte khác nhau) khi sao chép tệp từ Linux (64 bit) sang Windows (32 bit), thường có hoạt động sftp hoàn hảo. Khi sử dụng Windows với stfp, đường dẫn trong trường hợp C: \ to \ path cần được đặt là ssh2.sftp: // {$ resSFTP}/cygdrive/c/to/path nếu Cygwin được sử dụng cho SSH trên hộp Windows .

4

Đối với Tài liệu đơn giản phpseclib, triển khai SFTP PHP thuần túy.

Tham khảo theo liên kết:

Uploading files over SFTP using PHP

thư mục Cấu trúc:

Main Folder-> 
    my-files(Contain File Which Transfer To Remote Server) 
    phpseclib0.3.0 
    sftp.php 
9

Đối với tôi đây làm việc:

$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"; 
} 

tôi phải cài đặt libssh2-php đầu tiên, mặc dù:

sudo apt-get install libssh2-php 
+0

cảm ơn 'apt-get install libssh2-php' –

+0

Tôi nhận được gói libssh2-php không có sẵn để sử dụng' sudo apt-get install php-ssh2' thay vào đó – omega1