javascriptnode.jsnode-streamsssh2

convert readable stream to save it as a file in local


I am using ssh2-sftp-client to get the file from remote server. I am getting the file in readable stream. I want to convert this readable stream to the desired file (sample.png as a png file, sample.doc file as doc file etc.)

Here is my code-

let Client = require('ssh2-sftp-client');
let sftp = new Client();
 sftp.connect({
    host: sftpCredentials.host,
    port: sftpCredentials.port,
    username: sftpCredentials.username,
    password: sftpCredentials.password
}).then(res => sftp.list('/'))
.then(res => {
     const file = await sftp.get('/sample.png');

})

i want to save this file in local. File is a readable stream as follows -

ReadStream {_readableState: ReadableState, readable: true, domain: null, _events: Object, _eventsCount: 3, …}
    _events:Object {end: , error: , readable: }
    _eventsCount:3
    _maxListeners:undefined
    _readableState:ReadableState {objectMode: false, highWaterMark: 65536, buffer: BufferList, …}
    autoClose:true
    destroyed:false
    domain:null
    end:undefined
    flags:"r"
    handle:Buffer(4) [0, 0, 0, …]
    mode:438
    path:"/sample.png"
    pos:131072
    readable:true
    readableHighWaterMark:65536
    sftp:SFTPStream {_readableState: ReadableState, readable: true, domain: null, …}
    start:undefined
    __proto__:Readable {open: , _read: , destroy: , …}

Solution

  • As file is a readable stream,you can try

    let Client = require('ssh2-sftp-client');
        let fsv=vrequire('fs');
        let sftp = new Client();
         sftp.connect({
            host: sftpCredentials.host,
            port: sftpCredentials.port,
            username: sftpCredentials.username,
            password: sftpCredentials.password
        }).then(res => sftp.list('/'))
        .then(async res => {
             const file = await sftp.get('/sample.png');
             const ws=fs.createWriteStream('sample.png');
             file.pipe(ws);
             file.on('end',()=>console.log('done'));
        })