所以我正在创建一个类,最终想要创建一个方法,该方法在 SFTP 服务器上获取文件并生成可以通过管道传输到其他流/函数的读取流。我大部分时间都在那里,除了我的 readStream 表现得很奇怪。以下是相关代码:
const Client = require('ssh2').Client,
Readable = require('stream').Readable,
async = require('async');
/**
* Class Definition stuff
* ......
*/
getStream(get) {
const self = this;
const rs = new Readable;
rs._read = function() {
const read = this;
self.conn.on('ready', function(){
self.conn.sftp(function(err,sftp) {
if(err) return err;
sftp.open(get, 'r', function(err, fd){
sftp.fstat(fd, function(err, stats) {
let bufferSize = stats.size,
chunkSize = 512,//bytes
buffer = new Buffer(bufferSize),
bytesRead = 0;
async.whilst(
function () {
return bytesRead < bufferSize;
},
function (done) {
sftp.read(fd, buffer, bytesRead, chunkSize, bytesRead,
function (err, bytes, buff) {
if (err) return done(err);
// console.log(buff.toString('utf8'));
read.push(buff);
bytesRead += bytes;
done();
});
},
function (err) {
if (err) console.log(err);
read.push(null);
sftp.close(fd);
}
);
});
});
});
}).connect(self.connectionObj);
}
return rs;
}
在其他地方,我会这样称呼这个方法:
let sftp = new SFTP(credentials);
sftp.getStream('/path/file.csv')
.pipe(toStuff);
.pipe(toOutput);
所以,长话短说。在 SFTP.read 操作期间,会一遍又一遍地read.push(buff)
推送文件的相同第一部分。但是,当我console.log(buff)
正确地流式传输完整文件时?
所以我挠头想知道我对读取流做错了什么,它只是推动文件的开头,而不是继续到缓冲区的下一部分。
这是 SSH2 SFTP 客户端上的文档:https ://github.com/mscdex/ssh2-streams/blob/master/SFTPStream.md
我使用这个 SO 问题作为我上面所写内容的灵感:node.js fs.read() 示例
这是相似/相关的:Reading file from SFTP server using Node.js and SSH2