Node.js中的SFTP上传空文件

时间:2018-12-16 08:49:23

标签: node.js sftp ssh2-sftp

我正在处理的项目有问题,我正在使用称为sftp-ssh2-client的节点模块从FTP服务器下载文件,然后尝试将流传递回我的FTP服务器,但是进入另一个目录。

代码如下:

const stream = sftp.get(`path/to/file.csv.gz`).then(() => {

}).catch((err) => {

});

sftp.put(stream, 'path/to/new/file.csv.gz').then(() => {

}).catch((err) => {

})

但是,当我拨入FTP服务器到文件已放置到的位置时,文件大小为0,并且下载时已损坏。谁能告诉我我在做什么错?

非常感谢,

G

2 个答案:

答案 0 :(得分:2)

sftp.get()不返回流,它返回对 resolve 的承诺,因此您的代码应如下所示:

sftp.get('path/to/file.csv.gz').then(stream => {
  return sftp.put(stream, 'path/to/new/file.csv.gz');
}).catch(err => {
  ...
});

但是,在我看来,您可以只使用sftp.rename(),而无需下载和上传整个文件:

sftp.rename('path/to/file.csv.gz', 'path/to/new/file.csv.gz').then(...);

此外,如果您确实想采用先下载后上传的方法,请确保已阅读documentation regarding encoding

答案 1 :(得分:1)

 function uploadFile(req, res) {
    req.pipe(req.busboy);
    req.busboy.on('file', function(fieldname, file, filename) {
        // debug("Uploading: " + filename);
        filename = (new Date()).getTime() + '-' + filename;

        //Path where file will be uploaded
        var fstream = fs.createWriteStream(FILE_STORE + filename);

        file.pipe(fstream);

        fstream.on('close', function() {
            //   debug("Upload Finished of " + filename);
            var newFileName = FILE_STORE + filename;
            if (!fs.existsSync(newFileName)) {

                res.status(404).json({ 'message': 'file not found' })
                return;
            }
            res.status(200).json({ file: filename });
        })
    })

}