为了账号安全,请及时绑定邮箱和手机立即绑定

如何列出和创建远程 SFTP 文件的下载链接

如何列出和创建远程 SFTP 文件的下载链接

PHP
达令说 2021-12-03 19:40:13
我试图列出远程 SFTP 服务器中某个目录中的所有文件作为下载链接,以便用户可以选择下载这些文件。到目前为止,我已经能够读取并列出特定目录中的所有文件作为下载链接,但是当我尝试通过右键单击并选择将链接另存为...来实际下载文件时,我收到“失败 - 没有文件“ 信息。 我的结果图片<?php$connection = ssh2_connect('url', 22);ssh2_auth_password($connection, username, password);$sftp = ssh2_sftp($connection);$sftp_fd = intval($sftp);if ($handle = opendir("ssh2.sftp://$sftp_fd/path/to/remote/dir/")) {   while (($entry = readdir($handle)) !== false) {      if ($entry == "." || $entry == "..") { continue; }      echo '<a href="/path/to/remote/dir/' .$entry. '">' .$entry. '<br>'.'</a>';   }   closedir($handle);}?>     
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

生成的<a>标签中的链接指向不包含链接文件的 Web 服务器。


您需要做的是链接到 PHP 脚本,为其指定要下载的文件的名称。然后脚本将从 SFTP 服务器下载文件并将下载的文件传回给用户(到网络浏览器)。


echo '<a href="download.php?file='.urlencode($entry).'">'.htmlspecialchars($entry).'</a>';

download.php脚本的一个非常简单的版本:


<?


header('Content-Type: application/octet-stream');


$connection = ssh2_connect('url', 22);

ssh2_auth_password($connection, username, password);


$sftp = ssh2_sftp($connection);

$sftp_fd = intval($sftp);


echo file_get_contents("ssh2.sftp://$sftp_fd/path/to/remote/dir/" . $_GET["file"]);

尽管对于真正正确的解决方案,您应该提供一些与文件相关的 HTTP 标头,例如Content-Length,Content-Type和Content-Disposition。


同样,上面的简单示例将首先从 SFTP 服务器下载整个文件到网络服务器。只有这样它才会开始将其流式传输给用户(网络浏览器)。什么是浪费时间和网络服务器上的内存(如果文件足够大)。


看到一个类似的(虽然是 FTP,而不是 SFTP)问题:

Download file via PHP script from FTP server to browser with Content-Length header without stores the file on the web server


您可能还想自动检测Content-Type,除非您的所有文件都属于同一类型。


您当然可以使用URL 重写来使 URL 更漂亮。

即转向download.php?file=myfile.txt例如download/myfile.txt。


查看完整回答
反对 回复 2021-12-03
  • 1 回答
  • 0 关注
  • 224 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信