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

标签 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 方法,由于某种原因尝试在本地获取文件,即使我给它一个流。

最佳答案

出于某种原因,方法s3.putObject正在本地查找文件,即使我给了它一个流。该流包含来自服务器的路径,但无论出于何种原因,当 s3.putObject 方法读取流时,它会尝试在本地读取文件。

我通过使用 s3.upload 方法解决了这个问题。

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

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

关于javascript - 使用 SSH2 和 SFTPStream 将文件从服务器流式传输到 AWS S3 存储桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53601650/

相关文章:

node.js - nodejs 没有连接到任何其他端口

javascript - Node.js - 在不消耗大量内存的情况下传输大文件

amazon-web-services - 使用 go 按标签列出 AWS 中的负载均衡器

amazon-web-services - 带有 Flink 的 AWS EMR 集群不运行任何 Jar,而是给出 java.lang.NoSuchMethodError

javascript - Canvas :如何围绕指定的紫色点绘制从指定的橙色点到指定的绿色点的螺旋线

javascript - Kendo,你如何绑定(bind) MVVM 文本 : fields to a remote DataSource?

javascript - 将带撇号的字符串传递给 javascript 函数

node.js - 使用 Nodemailer nodejs 发送邮件的现代 Oauth2 身份验证

java - 限制 iOS 和 Android 的入站流量

javascript - Firefox CSS 动画不工作?