使用SSH2和SFTPStream将文件从服务器流传输到AWS S3存储桶

时间:2018-12-03 20:48:59

标签: javascript node.js amazon-web-services amazon-s3 sftp

我正在尝试使用ssh2模块从服务器获取文件并将其添加到AWS的S3存储桶中。我希望能够流式传输文件,这样我就不必将其存储在内存中。我尝试了以下方法:

const Client = require('ssh2').Client;
const aws = require('aws-sdk');
const s3 = new aws.S3();

exports.handler = function(event, context, callback) {

    let connSettings = {
        host: event.serverHost,
        port: event.port,
        username: event.username,
        password: event.password
    };

    let conn = new Client();
    conn.on('ready', function() {

        conn.sftp(true, function(err, sftp) {

            if (err) throw err;

            let stream = sftp.createReadStream(filename);
            let putParams = {
                Bucket: s3Bucket,
                Key: s3Key,
                Body: stream
            };

            s3.putObject(putParams, function (err) {
                if (err) throw err;

                console.log("Uploaded!");
            });     
        });
    }).connect(connSettings);

};  

但是,方法sftp.createReadStream(filename)在查看我的本地目录而不是服务器。除此之外,它还能起作用。

有没有办法将文件从服务器流传输到S3?

我知道我可以使用sftp.fastGet方法从服务器下载文件,将其保存在本地,然后将其上传到S3。但我希望不必将文件保存在本地。 s3 SDK接受流,因此仅对其进行流处理将更加方便。

更新:方法sftp.createReadStream(filename)是从服务器正确读取的,而不是从本地读取的。出于某种原因,s3.putObject方法试图在本地获取文件,即使我给了它一个流。

1 个答案:

答案 0 :(得分:0)

由于某种原因,即使我提供了流,方法s3.putObject也在本地查找文件。流包含来自服务器的路径,但是由于某种原因,当方法s3.putObject方法正在读取流时,它将尝试在本地读取文件。

我改用s3.upload方法解决了这个问题。

s3.upload(putParams, function (err) {
    if (err) throw err;

    console.log("Uploaded!");
});