2013-04-22 2 views
3

Я ищу, чтобы позволить пользователю загружать файл непосредственно с сервера sftp, но в браузере.Как загрузить файл с SFTP-сервера с помощью PHP

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

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

Вы можете скачать с сайта sftp на диск пользователя?

Приветствия за любые ответы!

+0

PHP имеет [функции FTP] (http://www.php.net/manual/en/ref.ftp.php) – DarkBee

+2

* <предыдущий комментарий redacted> * Ничего, я просто понял, что вы имеете в виду. Все, что вам нужно сделать, это принудительно загрузить с помощью 'Content-Disposition: attachment; filename = "yourfile.ext" и эхо-данные, как вы это делаете. – DaveRandom

+0

Cheers @DaveRandom - это, похоже, сработало! – coffeedoughnuts

ответ

4

Вам не нужен 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 Manual Documentation. Использование curl_exec() без установки параметра CURLOPT_RETURNTRANSFER в true вызывает завихрение отправки вывода (файла) непосредственно в браузер.

Смежные вопросы