Как загрузить файл с SFTP-сервера с помощью PHP

Я хочу, чтобы пользователь мог загружать файл непосредственно с sftp-сервера, но в браузере.

Я нашел методы для чтения файла и повторения строки (соединения с использованием ssh2.sftp или phpseclib), но мне нужно скачать, а не читать.

Кроме того, я видел решения, которые предлагают загружать с sftp-сервера на веб-сервер, а затем использовать readfile() с веб-сервера на локальный диск пользователя. Но это означает две передачи файлов, и если файл большой, я думаю, это будет медленно.

Можете ли вы скачать напрямую с sftp на диск пользователя?

Приветствую любые ответы!


person coffeedoughnuts    schedule 22.04.2013    source источник
comment
PHP имеет функции FTP   -  person DarkBee    schedule 22.04.2013
comment
‹предыдущий комментарий отредактирован› Неважно, я только что понял, что вы имеете в виду. Все, что вам нужно сделать, это форсировать загрузку, используя заголовок Content-Disposition: attachment; filename="yourfile.ext", и повторить данные, как вы это делаете.   -  person DaveRandom    schedule 22.04.2013
comment
Ура @DaveRandom - похоже, это сработало!   -  person coffeedoughnuts    schedule 22.04.2013
comment
на самом деле - @DaveRandom - сотрите это - кажется, дерьмо на больших файлах ... Я думаю, все это приводит к тому, что файл помещается во временное место, а затем предлагает вам сохранить ... найти текст и изображения, но не файлы фильмов , с чем я работаю.   -  person coffeedoughnuts    schedule 22.04.2013
comment
@user1019085 user1019085 На самом деле это не должно иметь никакого значения, хотя у вас может быть сервер с включенной буферизацией вывода по умолчанию, что может показаться медленным - вы можете попробовать добавить while (@ob_end_clean()); в начало вашего скрипта и снова протестировать. Также вы можете взглянуть на stream_copy_to_stream(), который немного эффективнее, чем эхо в цикл - хотя вам нужно будет использовать указатель потока на php://output, чтобы использовать это, что немного сложнее.   -  person DaveRandom    schedule 22.04.2013


Ответы (1)


Вам не нужен 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