使用Node.js和SSH2从SFTP服务器读取文件

亚当·拉姆伯格

我在Node.js中使用读取流时遇到一个非常奇怪的问题。我正在使用SSH2在我和sftp服务器之间创建sftp连接。然后,我尝试从sftp流创建一个读取流。从读取流的发出的“数据”事件中,我将数据追加到数组中。当读取流的“关闭”事件发生时,我调用Buffer.concat来创建concat,我将检索到的所有数据块都放入一个缓冲区中。这是在堆栈溢出时在此处提出的其他问题中描述的相同技术。例如这里但是,我无法使用检索到的数据。似乎缓冲区的大小比我要检索的文件小32个字节(通过计算检索到的数据的长度)。这与我的SFTP连接有关吗?还是我如何创建读取流?

如果重要的话,该文件的类型为zip。当我尝试读取文件以缓冲后解压缩文件(在node.js中并手动)时,它不起作用。

经过调查,我发现:

  1. 当我在文件上使用readdir时,文件大小正确。
  2. 对我的开发使用FTP(JSFTP)FTP服务器使用上面的相同技术可以很好地工作。

任何建议表示赞赏!

这是我的代码:

        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);
亚当·拉姆伯格

因此,经过大量调查,我终于意识到在“数据”事件中传输的最后几位数据有问题。据我了解,这似乎是读取流实现中的一个错误。通过使用SSH2库中更简单的功能(open,fstat,read),我能够解决此问题。这个解决方案对我有用。希望在其他人遇到相同问题的情况下共享解决方案。

工作代码:

sftp.open(config.ftpPath + "/" + m_fileName, "r", function(err, fd) {
sftp.fstat(fd, function(err, stats) {
    var bufferSize = stats.size,
        chunkSize = 16384,
        buffer = new Buffer(bufferSize),
        bytesRead = 0,
        errorOccured = false;

    while (bytesRead < bufferSize && !errorOccured) {
        if ((bytesRead + chunkSize) > bufferSize) {
            chunkSize = (bufferSize - bytesRead);
        }
        sftp.read(fd, buffer, bytesRead, chunkSize, bytesRead, callbackFunc);
        bytesRead += chunkSize;
    }

    var totalBytesRead = 0;
    function callbackFunc(err, bytesRead, buf, pos) {
        if(err) {
            writeToErrorLog("downloadFile(): Error retrieving the file.");
            errorOccured = true;
            sftp.close(fd);
        }
        totalBytesRead += bytesRead;
        data.push(buf);
        if(totalBytesRead === bufferSize) {
            m_fileBuffer = Buffer.concat(data);
            writeToLog("downloadFile(): File saved to buffer.");
            sftp.close(fd);
            m_eventEmitter.emit(' downloadFile_Completed ');
        }
    }
})
});   

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用ssh2和node.js计算远程服务器上的磁盘空间并存储值?

来自分类Dev

为什么我可以使用gFTP将SSH2连接到SFTP服务器?

来自分类Dev

使用pdfplumber和Paramiko从SFTP服务器读取PDF文件

来自分类Dev

在Windows上使用SFTP和公共SSH密钥使用FileZilla连接到服务器

来自分类Dev

在客户端和Node.js服务器上使用静态JavaScript文件

来自分类Dev

在for循环中使用ssh2访问多个服务器的async / await不起作用

来自分类Dev

使用SSH.NET从SFTP服务器下载一个特定文件

来自分类Dev

使用Flask和JS从服务器下载文件

来自分类Dev

使用批处理文件和PuTTY在远程服务器上执行sftp命令

来自分类Dev

使用批处理文件和PuTTY在远程服务器上执行sftp命令

来自分类Dev

如何使用VLC在SSH服务器上(使用sftp或smth其他)监视文件(正在修改文件)?

来自分类Dev

无法通过 SFTP 使用 PHP、ssh2 下载最新文件

来自分类Dev

如何使用 shell 脚本从远程服务器 SSH 读取 .json 文件

来自分类Dev

将从服务器获取的数据处理到html文件中(使用Node.js和Express)

来自分类Dev

如何使用Node.js从远程服务器复制带有空格和utf8的文件

来自分类Dev

错误:使用Node.js连接到mysql服务器时,读取ECONNRESET

来自分类Dev

如何使用Spring从SFTP服务器获取zip文件

来自分类Dev

不使用 JSch 从 SFTP 服务器下载文件

来自分类Dev

使用Node.js ssh2模块模拟ssh的ProxyCommand

来自分类Dev

使用matlab在ssh服务器中读取远程图像

来自分类Dev

如何从Node JS服务器读取JSON响应?

来自分类Dev

有关使用Node.js“代理”服务器代理CSS和JS的建议

来自分类Dev

简单的Node.js Web服务器始终发送文本/纯CSS和JS文件

来自分类Dev

使用Flask读取和写入json文件到服务器

来自分类Dev

如何使用ssh和if语句测试文件是否在远程服务器中签入

来自分类Dev

使用Node和Gulp设置构建服务器

来自分类Dev

在Node.js中使用ssh2传输整个目录

来自分类Dev

使用批处理文件打开多个node.js服务器

来自分类Dev

如何使用node.js在服务器上打开文件

Related 相关文章

  1. 1

    如何使用ssh2和node.js计算远程服务器上的磁盘空间并存储值?

  2. 2

    为什么我可以使用gFTP将SSH2连接到SFTP服务器?

  3. 3

    使用pdfplumber和Paramiko从SFTP服务器读取PDF文件

  4. 4

    在Windows上使用SFTP和公共SSH密钥使用FileZilla连接到服务器

  5. 5

    在客户端和Node.js服务器上使用静态JavaScript文件

  6. 6

    在for循环中使用ssh2访问多个服务器的async / await不起作用

  7. 7

    使用SSH.NET从SFTP服务器下载一个特定文件

  8. 8

    使用Flask和JS从服务器下载文件

  9. 9

    使用批处理文件和PuTTY在远程服务器上执行sftp命令

  10. 10

    使用批处理文件和PuTTY在远程服务器上执行sftp命令

  11. 11

    如何使用VLC在SSH服务器上(使用sftp或smth其他)监视文件(正在修改文件)?

  12. 12

    无法通过 SFTP 使用 PHP、ssh2 下载最新文件

  13. 13

    如何使用 shell 脚本从远程服务器 SSH 读取 .json 文件

  14. 14

    将从服务器获取的数据处理到html文件中(使用Node.js和Express)

  15. 15

    如何使用Node.js从远程服务器复制带有空格和utf8的文件

  16. 16

    错误:使用Node.js连接到mysql服务器时,读取ECONNRESET

  17. 17

    如何使用Spring从SFTP服务器获取zip文件

  18. 18

    不使用 JSch 从 SFTP 服务器下载文件

  19. 19

    使用Node.js ssh2模块模拟ssh的ProxyCommand

  20. 20

    使用matlab在ssh服务器中读取远程图像

  21. 21

    如何从Node JS服务器读取JSON响应?

  22. 22

    有关使用Node.js“代理”服务器代理CSS和JS的建议

  23. 23

    简单的Node.js Web服务器始终发送文本/纯CSS和JS文件

  24. 24

    使用Flask读取和写入json文件到服务器

  25. 25

    如何使用ssh和if语句测试文件是否在远程服务器中签入

  26. 26

    使用Node和Gulp设置构建服务器

  27. 27

    在Node.js中使用ssh2传输整个目录

  28. 28

    使用批处理文件打开多个node.js服务器

  29. 29

    如何使用node.js在服务器上打开文件

热门标签

归档