【发布时间】:2016-09-19 09:21:53
【问题描述】:
我在 Node.js 中处理读取流时遇到了一个非常奇怪的问题。我正在使用 SSH2 在我和 sftp 服务器之间创建一个 sftp 连接。然后我尝试从 sftp 流创建一个读取流。从读取流发出的“数据”事件中,我将数据附加到数组中。当读取流的“关闭”事件发生时,我会调用 Buffer.concat 来创建连接所有已检索到一个缓冲区的数据块。这与此处在堆栈溢出时提出的其他问题中描述的技术相同。例如here。但是,我无法使用检索到的数据。似乎缓冲区的大小比我尝试检索的文件小 32 个字节(从计算检索到的数据的长度)。这可能与我的 SFTP 连接有关吗?或者我如何创建我的阅读流?
如果重要的话,文件是 zip 类型的。当我在读取文件以缓冲后尝试解压缩文件(在 node.js 中并手动)时,它不起作用。
经过调查,我发现:
- 当我对文件使用 readdir 时,文件的大小是正确的。
- 对我的开发 FTP 服务器使用 FTP (JSFTP) 使用上述相同的技术可以正常工作。
感谢任何建议!
这是我的代码:
var Client = require('ssh2').Client;
var m_ssh2Credentials = {
host: config.ftpHostName,
port: config.ftpPort,
username: config.ftpUser,
password: config.ftpPassword,
readyTimeout: 20000,
algorithms: { cipher: ["3des-cbc", "aes256-cbc", "aes192-cbc","aes128-cbc"]}
};
...
var conn = new Client();
var dataLength = 0;
conn.on('ready', function() {
conn.sftp(function(err, sftp) {
if (err) {
writeToErrorLog("downloadFile(): Failed to open SFTP connection.");
} else {
writeToLog("downloadFile(): Opened SFTP connection.");
}
var streamErr = "";
var dataLength = 0;
var stream = sftp.createReadStream(config.ftpPath + "/" + m_fileName)
stream.on('data', function(d){
data.push(d);
dataLength += d.length;
});
.on('error', function(e){
streamErr = e;
})
.on('close', function(){
if(streamErr) {
writeToErrorLog("downloadFile(): Error retrieving the file: " + streamErr);
} else {
writeToLog("downloadFile(): No error using read stream.");
m_fileBuffer = Buffer.concat(data, dataLength);
writeToLog("Data length: " + dataLength);
writeToLog("downloadFile(): File saved to buffer.");
}
conn.end();
});
})
})
.on('error', function(err) {
writeToErrorLog("downloadFile(): Error connecting: " + err);
}).connect(m_ssh2Credentials);
【问题讨论】:
标签: javascript node.js buffer sftp readable