7

我觉得这值得一个问题,因为 StackOverflow 似乎没有足够的主题。

我想使用带有进度条的 PHP 进行 SFTP

我喜欢进度条。然而,这一次我想做一些不同的事情。我想用 PHP 做以下事情,这个看起来比上一个要困难得多:

  • 通过 SFTP(通过 SSH?)执行下载
  • 为用户提供下载进度的可见指示
  • 启用暂停和继续下载

想想FileZilla,但在浏览器中,用 PHP 构建。我不想破解 Apache 或添加任何 Apache 模组。


实际下载的选项

对于基本的 SFTP 下载,这里这里这里这里有很多问题。

这些文档PHP 的 SSH2 扩展(我目前正在使用 - 你通过 pecl 安装它)和替代PHPSecLib,我没有使用,但可能会在以后查看。
我的界面允许轻松换入/换出 - 对接口进行编码而不是实现等......

这很好,但他们只是执行实际下载,仅此而已。

下载进度

PHP 有一个非常有趣的回调函数stream_notification_callback您可以在此处了解更多信息

这看起来很棒,并且是一个很有希望的步骤,直到有人查看了 PHP 的源代码并发现不幸的是,SSH2 / SFTP不允许与此集成
感谢 hek2mgl 努力研究这个

这个想法stream_notification_callback是在每次检索数据时传递当前下载大小的通知;因此给出了使用当前下载量和总文件大小计算百分比所需的数据。但这不适用于 SSH2 和 SFTP ......

那么暂停/继续呢?

在我看来,这将是最难完成的。将数据下载到临时文件是可能的......这是我设法挖掘的内容:http ://ee.php.net/manual/en/function.fread.php#84115 - 但是将这种代码与进度条似乎很疯狂。

最后

还有cURL,但是我没有看到通过SFTP尽可能暂停/恢复下载。如我错了请纠正我。

那么,我将如何使用 PHP 在浏览器中集成上述要求?忘记客户端的东西,只需将数据发送到浏览器就足够了,因此执行此操作的建议会很棒。

4

2 回答 2

2

这是我从该站点获取的示例:

    // Write from our remote stream to our local stream
    $read = 0;
    $fileSize = filesize("ssh2.sftp://$sftp/$fileName");
    while ($read < $fileSize && ($buffer = fread($remoteStream, $fileSize - $read))) {
        // Increase our bytes read
        $read += strlen($buffer);

        // Write to our local file
        if (fwrite($localStream, $buffer) === FALSE) {
            throw new Exception("Unable to write to local file: /localdir/$fileName");
        }
    }

由于您有文件的大小并且您使用 fread 从文件中读取,因此确定您的进度是微不足道的。

如果用户单击“暂停”按钮,可以通过检查您设置的 APC 中的值来完成暂停(在 iframe 中执行此操作,这样您就不会停止主脚本)。

于 2013-09-09T01:55:41.807 回答
1

使用 PHP 下载大文件时检查服务器失败。可能会给你一些想法。

总结一下......其中一个答案建议修改 phpseclib 以在每次收到块时回显数据。另一个答案建议只下载块并在下载块时输出它们。

似乎这与您使用 stream_notification_callback 的想法非常一致。

祝你好运!

于 2013-03-27T19:25:26.913 回答