📅  最后修改于: 2023-12-03 15:33:11.145000             🧑  作者: Mango
本篇文章将介绍如何使用 Node.js 和 AWS S3 SDK 实现上传一个大文件的功能,通过使用流式上传大文件,可以避免因将整个文件读取到内存中而导致的内存溢出问题。
Node.js 环境和 AWS S3 的访问密钥。如果没有 AWS S3 的访问权限,请根据 AWS 官方文档进行配置。
首先,我们需要安装 AWS S3 SDK 和 through2
库。
npm install aws-sdk through2
const AWS = require('aws-sdk');
const through2 = require('through2');
const s3 = new AWS.S3({
accessKeyId: 'YOUR_AWS_ACCESS_KEY',
secretAccessKey: 'YOUR_AWS_SECRET_ACCESS_KEY',
});
const uploadLargeFileToS3 = (filePath, s3BucketName, s3ObjectName) => {
const stream = require('fs').createReadStream(filePath);
return new Promise((resolve, reject) => {
stream.pipe(through2.obj(function (chunk, encoding, callback) {
this.push(chunk);
callback();
}))
.on('error', (error) => {
reject(error);
})
.on('end', () => {
s3.putObject({
Bucket: s3BucketName,
Key: s3ObjectName,
Body: stream,
}, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
});
};
uploadLargeFileToS3('path/to/your/largeFile.txt', 'yourS3BucketName', 's3ObjectName')
.then((data) => {
console.log(`Success: ${data}`);
})
.catch((error) => {
console.error(`Error: ${error}`);
});
在这个示例中,我们使用了 Node.js 默认的文件流来读取文件。使用 through2
库将数据从一个流传递到另一个流。
const stream = require('fs').createReadStream(filePath);
stream.pipe(through2.obj(function (chunk, encoding, callback) {
this.push(chunk);
callback();
}))
我们创建了一个 through2
转换流。 当文件读取结束时,我们使用 AWS S3 SDK putObject
方法将其上传到指定的 S3 Bucket。请确保您有访问此存储桶并将连接原始文件的权限。
s3.putObject({
Bucket: s3BucketName,
Key: s3ObjectName,
Body: stream,
}, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
使用 Node.js 中的流式上传可以处理大文件的上传,避免因将整个文件读取到内存中而导致的内存溢出问题。 在上述示例中,通过使用 through2
库来在内存中处理文件数据流,并使用 AWS S3 SDK 将文件上传至对应的 S3 Bucket。