我目前正在使用以下代码的类似版本将文件从远程服务器传输到我的Web服务器,然后在可公开访问的Web位置重定向到该文件的Web服务器副本。
$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' ) ;
我也使用他们的api从亚马逊s3获得了一些文件。当我使用此方法时,api将文件作为对象返回,因此我可以使用适当的标头将其直接发送到浏览器。如下面的例子。
// Display the object in the browser
header("Content-Type: {$result['ContentType']}");
header("Content-Type: audio/wav");
echo $result['Body'];
}
我的问题是如何从远程服务器流式传输/获取文件并以与底部版本相同的方式将其发送到浏览器,而无需在Web服务器上创建物理副本。非常感谢提前
答案 0 :(得分:3)
您可以使用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));
}
我没有测试过代码,但它应该可以运行。
答案 1 :(得分:2)
您可以使用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对此方法的回答。