PHP - SSH2 SFTP下载与进展

时间:2013-03-27 16:34:13

标签: php sftp libssh2

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

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

I love progress bars。但是,这次我想做一些不同的事情。我想用PHP做以下事情,这个看起来比上一个难得多:

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

思考FileZilla,但是在浏览器中,使用PHP构建。我不想破解Apache或添加任何Apache mod。


实际下载的选项

基本的SFTP下载有很多问题herehereherehere

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

这很棒,但他们只是执行实际的下载而且就是这样。

下载进度

PHP有一个非常有趣的回调叫做stream_notification_callbackwhich you can read more about here

这看起来很棒,并且是一个有希望的步骤,直到有人查看PHP的源代码并发现,不幸的是,SSH2 / SFTP doesn't allow integration with this
感谢hek2mgl放入努力研究这个

stream_notification_callback的想法是每次检索数据时都会传递当前下载大小的通知;因此,使用当前下载的金额和总文件大小提供计算百分比所需的数据。但这与SSH2和SFTP没有关系......

暂停/继续怎么办?

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

最后

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

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

2 个答案:

答案 0 :(得分:2)

以下是我从this site获取的示例:

    // 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中执行此操作,这样就不会停止主脚本)。

答案 1 :(得分:1)

结帐Server fails when downloading large files with PHP。可能会给你一些想法。

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

看起来很像你使用stream_notification_callback的想法。

祝你好运!