如何使用 PHP 从 SFTP 服务器下载文件
我希望允许用户直接从 sftp 服务器下载文件,但在浏览器中.
I'm looking to allow a user to download a file directly from an sftp server, but in the browser.
我找到了读取文件和回显字符串的方法(使用 ssh2.sftp 或 phpseclib 连接),但我需要下载,而不是读取.
I've found methods to read the file and echo the string (connections using ssh2.sftp or phpseclib) but I need to download, rather than read.
此外,我看到的解决方案建议从 sftp 服务器下载到 Web 服务器,然后使用 readfile() 从 Web 服务器到用户的本地磁盘.但这意味着两个文件传输,如果文件很大,我想这会很慢.
Also, I've seen solutions that suggest downloading from the sftp server to the web server, then use readfile() from the web server to the user's local disk. But this means two file transfers, and if the file is large I imagine this would be slow.
您可以直接从 sftp 下载到用户磁盘吗?
Can you download directly from sftp to the user's disk?
为任何回复干杯!
推荐答案
您不需要任何 php 来允许用户直接从 SFTP 服务器下载,如果您将文件的直接链接添加到您的 html(即下载文本).当然,如果您不想公开 ftp 服务器的凭据,这将不起作用.
You don't need any php in order to allow the user to download directly from the SFTP server, if you add a direct link to the file to your html (i.e. Download Text). Of course this won't work if you don't want to make the credentials for the ftp server public.
如果您想通过服务器从 SFTP 中提取文件,根据定义,您必须先将文件下载到服务器,然后再将其发送回用户浏览器.
If you are looking to pull the file from the SFTP through your server, you, by deffinition, must download the file to the server before sending it back out to the users browser.
为此,有很多很多解决方案.最少的开销可能来自使用phpseclib如下
For this there are many, many solutions. The least overhead would probably come from using phpseclib as below
<?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 配置允许的内存大,那么这很可能会导致问题.
Unfortunately, if the file is larger than is allowed in memory by your server/php configuration, then this well cause problems.
如果你想更进一步,你可以试试
If you want to take it a step further, you might try
//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 将输出(文件)直接发送到浏览器.
More information on using cURL can be found in the PHP Manual Documentation. Using curl_exec() without setting the CURLOPT_RETURNTRANSFER option to true causes curl to send the output (the file) directly to the browser.
相关文章