首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何列出和创建远程SFTP文件的下载链接

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

Stack Overflow用户
提问于 2019-08-25 10:46:24
回答 1查看 2.8K关注 0票数 1

我试图将远程SFTP服务器中某个目录中的所有文件作为下载链接列出,以便用户可以选择下载这些文件。到目前为止,我已经能够读取并列出一个特定目录中的所有文件作为下载链接,但是当我试图通过右键单击并选择save作为.我收到一条“失败-没有文件”的消息。我的结果图片

代码语言:javascript
复制
<?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);
}
?>     
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-25 12:43:10

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

您需要做的是链接到一个PHP脚本,给它一个要下载的文件的名称。然后,脚本将从SFTP服务器下载该文件,并将下载的文件传回给用户( user浏览器)。

代码语言:javascript
复制
echo '<a href="download.php?file='.urlencode($entry).'">'.htmlspecialchars($entry).'</a>';

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

代码语言:javascript
复制
<?

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"]);

虽然对于真正正确的解决方案,您应该提供一些与文件相关的headers,比如Content-LengthContent-TypeContent-Disposition

另外,上面的简单示例将首先将整个文件从SFTP服务器下载到the服务器。只有这样,它才会开始将其流到用户(webbrowser)。什么是浪费时间,也浪费了are服务器上的内存(如果文件足够大的话)。

请参见一个类似的问题(尽管是FTP,而不是SFTP):

通过PHP脚本从FTP服务器下载文件到具有内容长度头的浏览器,而不将文件存储在web服务器上。

您还可能希望自动检测Content-Type,除非您的所有文件都是相同类型的。

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

例如,将download.php?file=myfile.txt转换为download/myfile.txt

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57645321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档