3

ユーザーがsftpサーバーから直接ファイルをダウンロードできるようにしたいと考えていますが、ブラウザで.

ファイルを読み取って文字列をエコーする方法 (ssh2.sftp または phpseclib を使用した接続) を見つけましたが、読み取るのではなく、ダウンロードする必要があります。

また、sftp サーバーから Web サーバーにダウンロードし、Web サーバーからユーザーのローカル ディスクに readfile() を使用することを提案するソリューションを見てきました。しかし、これは 2 つのファイル転送を意味し、ファイルが大きい場合、これは遅くなると思います。

sftp からユーザーのディスクに直接ダウンロードできますか?

どんな反応でも乾杯!

4

1 に答える 1

4

ファイルへの直接リンクを html に追加する場合 (つまり、テキストのダウンロード)、ユーザーが SFTP サーバーから直接ダウンロードできるようにするために、php は必要ありません。もちろん、ftp サーバーの資格情報を公開したくない場合、これは機能しません。

サーバーを介して SFTP からファイルを取得しようとしている場合は、定義上、ファイルをユーザーのブラウザーに送り返す前に、サーバーにファイルをダウンロードする必要があります。

これには、非常に多くのソリューションがあります。最小のオーバーヘッドは、おそらく 以下のようにphpseclibを使用することで発生します

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

//adds the proper headers to tell browser to download rather than display
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"filename.remote\""); 

// outputs the contents of filename.remote to the screen
echo $sftp->get('filename.remote');
?>

残念ながら、ファイルがサーバー/php 構成で許可されているメモリよりも大きい場合、問題が発生します。

一歩踏み出したい方はぜひお試しください

//adds the proper headers to tell browser to download rather than display
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"filename.remote\""); 

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "sftp://full_file_url.file"); #input
curl_setopt($curl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($curl, CURLOPT_USERPWD, "$_FTP[username]:$_FTP[password]");
curl_exec($curl);
curl_close($curl);

cURL の使用に関する詳細は、PHP マニュアル ドキュメントを参照してください。CURLOPT_RETURNTRANSFER オプションを true に設定せずに curl_exec() を使用すると、curl は出力 (ファイル) をブラウザーに直接送信します。

于 2013-04-29T17:11:34.653 に答える