gpt4 book ai didi

PHP - SSH2 SFTP 下载有进展

转载 作者:可可西里 更新时间:2023-11-01 12:57:59 24 4
gpt4 key购买 nike

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

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

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

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

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


实际下载的选项

有很多问题here , here , herehere用于基本的 SFTP 下载。

这些文档 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 在浏览器中集成上述要求?忘掉客户端的东西,只需将数据发送到浏览器就足够了,所以执行此操作的建议会很棒。

最佳答案

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

关于PHP - SSH2 SFTP 下载有进展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15664234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com