Вам не нужен php, чтобы позволить пользователю загружать напрямую с SFTP-сервера, если вы добавите прямую ссылку на файл в свой html (т.е. Текст загрузки). Конечно, это не сработает, если вы не хотите публиковать учетные данные для 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. Использование curl_exec() без установки для параметра CURLOPT_RETURNTRANSFER значения true приводит к тому, что curl отправляет вывод (файл) непосредственно в браузер.
person
Reid Johnson
schedule
29.04.2013
Content-Disposition: attachment; filename="yourfile.ext"
, и повторить данные, как вы это делаете. - person DaveRandom   schedule 22.04.2013while (@ob_end_clean());
в начало вашего скрипта и снова протестировать. Также вы можете взглянуть наstream_copy_to_stream()
, который немного эффективнее, чем эхо в цикл - хотя вам нужно будет использовать указатель потока наphp://output
, чтобы использовать это, что немного сложнее. - person DaveRandom   schedule 22.04.2013