使用节点获取 FTP-上传的进度

Getting a progress for an FTP-upload with node

我有一个 Electron 应用程序,它使用 node-ftp 将拖放的文件上传到预定义的服务器。上传就像一个魅力,但尽管阅读了一些建议,但我无法弄清楚如何获取有关进度条实际进度的信息。 到目前为止我的上传代码:

var ftp = new Client();
let uploadfile = fs.createReadStream(f.path);
let newname = uuid(); //some function I use for renaming

ftp.on('ready', function () {
    ftp.put(uploadfile, newname, function (err) {
        if (err) throw err;
        ftp.end();
    });
});

c.connect({user: 'test', password: 'test'});

我总是偶然发现监视 'data' 事件,但无法找到访问它的方式或位置(如您所见,我对 JavaScript 很陌生)。

在客户端,您可以为上传流创建 字节数 (http://www.experts.exchange.com/questions/24041115/upload-file-on-ftp-with-progressbar-and-time-left.html)

  • 将进度条的下限设置为 0
  • 设置上传文件的文件长度上限
  • 用字节数填充进度条

(http://www.whosebug.com/questions/24608048/how-do-i-count-bytecount-in-read-method-of-inputstream)

也许您可以像 stream-meter (https://www.npmjs.com/package/stream-meter) or progress-stream (https://www.npmjs.com/package/progress-stream) 一样使用 npm 并通过管道传输您的文件流以提供进度条。我不确定,因为我不知道 npm 的内部结构。 progress-stream 中有一个函数 transferred() 正好适合

一个非常准确的方法是在服务器上有代码向浏览器提供反馈(http://www.whosebug.com/questions/8480240/progress-bar-for-iframe-uploads)

知道了。我在 streams with percentage complete

中找到了答案

我的代码更改为

var ftp = new Client();
let uploadfile = fs.createReadStream(f.path);
let newname = uuid(); //some function I use for renaming

ftp.on('ready', function() {
    uploadfile.on('data', function(buffer) {
        var segmentLength = buffer.length;
        uploadedSize += segmentLength;
        console.log("Progress:\t" + ((uploadedSize/f.size*100).toFixed(2) + "%"));
    });

    ftp.put(uploadfile, newname, function(err) {
        if (err) throw err;
            ftp.end();
    });
});
c.connect({user: 'test', password: 'test'});

我在控制台中获取上传的百分比。从这里到图形输出只是一小步。