我试图将远程SFTP服务器中某个目录中的所有文件作为下载链接列出,以便用户可以选择下载这些文件。到目前为止,我已经能够读取并列出一个特定目录中的所有文件作为下载链接,但是当我试图通过右键单击并选择save作为.我收到一条“失败-没有文件”的消息。我的结果图片
<?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);
}
?> 发布于 2019-08-25 12:43:10
生成的<a>标记中的链接指向不包含链接文件的web服务器。
您需要做的是链接到一个PHP脚本,给它一个要下载的文件的名称。然后,脚本将从SFTP服务器下载该文件,并将下载的文件传回给用户( user浏览器)。
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"]);虽然对于真正正确的解决方案,您应该提供一些与文件相关的headers,比如Content-Length、Content-Type和Content-Disposition。
另外,上面的简单示例将首先将整个文件从SFTP服务器下载到the服务器。只有这样,它才会开始将其流到用户(webbrowser)。什么是浪费时间,也浪费了are服务器上的内存(如果文件足够大的话)。
请参见一个类似的问题(尽管是FTP,而不是SFTP):
通过PHP脚本从FTP服务器下载文件到具有内容长度头的浏览器,而不将文件存储在web服务器上。
您还可能希望自动检测Content-Type,除非您的所有文件都是相同类型的。
当然,您可以使用URL重写使URL更漂亮。
例如,将download.php?file=myfile.txt转换为download/myfile.txt。
https://stackoverflow.com/questions/57645321
复制相似问题