node.js - 单独获取 AWS S3 文件并加入它们?
问题描述
每天,我从 S3 下载几个大文件。
我只使用getObject
功能。
有时,我担心我的代码内存超出限制。
是否可以单独获取文件s3
并合并它们?
我附上我当前的代码以帮助理解。
const AWS = require('aws-sdk');
const fs = require('fs');
function getOneFile() {
AWS.config.update({
accessKeyId: "",
secretAccessKey: "",
region: "",
endpoint: ""
});
var s3 = new AWS.S3();
var params = {
Bucket: "bucket-name",
Key: "key"
};
// If file size is too big,
// How can I change under code?
s3.getObject(params, function (err, data) {
if(err) {
console.log(err);
} else {
fs.writeFileSync("downloads/saveName.txt", data.Body.toString());
}
});
}
解决方案
在 Node.js 中处理大文件的典型方法是利用Streams。您将获得一个 ReadableStream,使用fs.createWriteStream
和pipe
(或者,最好是pipeline
)创建一个 WritableStream - 这在流的 API 文档中得到了很好的解释。
现在,问题仍然存在:我们如何让 AWS 开发工具包返回一个 ReadableStream 而不是一个大缓冲区?
API 参考记录了您在响应 s3.getObject 时获得的回调参数,如下所示:
Body — (Buffer(Node.js), Typed Array(Browser), ReadableStream)
Object data.
这是非常无用的,并且似乎表明您可以获得几种不同类型的 Body 作为回调参数 - Buffer 或 ReadableStream,但不清楚如何选择您想要的。
但是,AWS.Request(基类)有一个.createReadStream()
方法,应该做你想做的事:
https ://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html#createReadStream-property
这是一个现有的 StackOverflow 答案和一个使用示例: https ://stackoverflow.com/a/65683054/6098312
推荐阅读
- c++ - Doxygen 抱怨没有记录 vector<>.resize
- java - 如何在获取映射请求中使用 RequestHeader 值,而不是在 Spring Boot 中使用 PathVariable 来使用 findById 获取数据?
- javascript - 使用 Selenium javascript 禁用 Chrome 对话框“加载扩展失败”
- python - Flask 应用程序在本地运行顺利,但在 Heroku 上部署时出错
- c++ - 使用通配指针和空指针调用函数时的输出说明
- node.js - Friebase:如何加入多个表并使用 API 发送 json
- javascript - Problem with for loop terminating on an error
- c# - 如何检测是否有 3 个或更多对象同时接触(由第四个对象链接)[C# Unity]
- django - 从 Django 模板传递数据以响应 App
- docker - 无法杀死每 10 秒重新启动的 docker