📜  nodejs aws s3 流上传 - Javascript (1)

📅  最后修改于: 2023-12-03 15:33:11.145000             🧑  作者: Mango

Node.js AWS S3 流上传 - Javascript

本篇文章将介绍如何使用 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。