javascript - 使用 SSH2 和 SFTPStream 将文件从服务器流式传输到 AWS S3 存储桶
问题描述
我正在尝试使用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!");
});
推荐阅读
- vue.js - 如何在 Vue 中传递 URL 查询字符串?
- c# - 在正确文化中的应用,但只返回键名而不是值
- iterator - 在 LLVM 中迭代机器指令
- django - 使用具有多对多字段的 Django F 表达式
- python - nn.Linear 之后矩阵的链式规则输出
- java - 按每个数字及其索引的乘积对整数数组进行排序?‽
- php - 如何允许人们将我的 Facebook 应用程序订阅到他们的主页?
- javascript - 使用 javascrip 更改 html 文本并再次返回
- python - Openvpn 看不到 Mysql 数据库的变化
- javascript - 为什么以及何时会立即忽略变量声明,并在后续查询中覆盖函数声明?