我正在尝试使用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
方法试图在本地获取文件,即使我给了它一个流。
答案 0 :(得分:0)
由于某种原因,即使我提供了流,方法s3.putObject
也在本地查找文件。流包含来自服务器的路径,但是由于某种原因,当方法s3.putObject
方法正在读取流时,它将尝试在本地读取文件。
我改用s3.upload
方法解决了这个问题。
s3.upload(putParams, function (err) {
if (err) throw err;
console.log("Uploaded!");
});