Как я могу получить удаленный файл на php по ssh и вернуть файл непосредственно в ответ браузера без создания копии файла на веб-сервере


В настоящее время я использую аналогичную версию приведенного ниже кода для передачи файла с удаленного сервера на мой веб-сервер, а затем перенаправляю на веб-сервер копию файла в общедоступном веб-расположении.

$tempfile = "/mylocalfolder/tempfile.wav" 

if (file_exists($tempfile)) {
        unlink($tempfile);
    }

$selectedfile = htmlspecialchars($_GET["File"]);
$filelink = '/myremotefolder/'.$selectedfile;

$connection = ssh2_connect($remote_server_ip, 22);
ssh2_auth_password($connection, 'username', 'password');

//echo $filelink.','. $tempfile;
ssh2_scp_recv($connection, $filelink, "/mylocalfolder/tempfile.wav");

header( 'Location: /mylocalfolder/recording.wav' ) ;

Я также получаю некоторые файлы из amazon s3, используя их api. Когда я использую этот метод, api возвращает файл в виде объекта, поэтому я могу отправить его непосредственно в браузер с соответствующими заголовками. как в приведенном ниже примере.

// Display the object in the browser
header("Content-Type: {$result['ContentType']}");
header("Content-Type: audio/wav");
echo $result['Body'];
}

Мой вопрос в том, как можно потоковая передача/получение файла с удаленного сервера и отправка его в браузер таким же образом, как и в нижней версии, без создания физической копии на веб-сервере. Заранее большое спасибо

 3
Author: Ross, 2016-03-10

2 answers

Вы можете использовать ssh2_sftp http://php.net/manual/en/function.ssh2-sftp.php ... вы должны установить привязки ssh2 в качестве расширения PECL (http://php.net/manual/es/book.ssh2.php)

Примером кода может быть...

$sftp = ssh2_sftp($connection);

$remote = fopen("ssh2.sftp://$sftp/path/to/file", 'rb');

header( 'Content-type: ......');

while(!feof($remote)){
    echo( fread($remote, 4096));
}

Я не тестировал код, но он должен работать.

 3
Author: SilvioQ, 2016-03-10 15:33:37

Вы можете использовать phpseclib для загрузки файла:

require_once 'Net/SFTP.php';

$connection = new Net_SFTP($remote_server_ip);
if (!$connection->login('username', 'password')) die('Login Error');

// set some appropriate content headers
echo $connection->get($filelink);

Или вы можете использовать оболочку ssh2.sftp - см. Ответ SilvioQ для этого подхода.

 2
Author: DerVO, 2016-03-10 15:33:48