我使用ssh2-sftp-client为nodeJS连接到sftp服务器并获取文件
但是我遇到了一个问题,当比一个块更多时,数据没有被正确接收,它在块之间丢失了一个字符:
例如:sftp上的文件有'sftp文件中的一些字符串'
如果它以块的形式分割,接收的数据将如下:
第一块:'某些字符串f'
第二个缺口:'om sftp file'
在这个例子中'r'丢失了
const getFile = readable => new Promise((resolve, reject) => {
let file = '';
readable.on('data', (chunk) => { file += chunk; });
readable.on('end', () => resolve(file));
readable.on('error', reject);
});
const readable = await sftp.get(fileName, false);
sftp.get()返回NodeJS.ReadableStream
有人遇到同样的问题吗?
答案 0 :(得分:0)
更可取的做法是将块存储为数组,然后将它们连接到缓冲区并在结束时获取字符串值:
const fs = require('fs');
const getFile = readable => new Promise((resolve, reject) => {
const file = [];
readable.on('data', chunk => file.push(Buffer.from(chunk, 'base64')));
readable.on('end', () => resolve(Buffer.concat(file).toString()));
readable.on('error', reject);
});
const readable = fs.createReadStream('package.json');
getFile(readable).then(file => console.log('file', file));
在本地运行并按预期获取文件内容。
答案 1 :(得分:0)
经过长时间的研究后,我发现问题,在模块sftp-stream中,可读流highWaterMark被设置为64 * 1024,而错误是如果一个块有64 * 1024个咬,那么就会丢失一个咬。我只是将水印设置为64 * 1024-1。