Node JS - 将数据从 Busboy 流式传输到 AWS S3

2024-02-28

我正在尝试通过 ec2 将文件上传到 s3。 我的第一个方法是 - 将文件完全上传到 ec2,然后将该文件上传到 s3。这种方法不好,因为从 ec2 到 s3 的传输时间是浪费时间。

目前我正在尝试使用服务员上传流 to s3上传流这样上传到 ec2,然后上传到 s3 将与 s3 同时完成"upload"方法支持流作为上传Body。

这是我的代码 -

router.post('/s3StreamUpload', function(req, res, next) {
   var busboy = new Busboy({headers: req.headers});
   busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
      console.log('Before Upload: ' + new Date());
      console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype);

      var s3 = new AWS.S3({
         params: {Bucket: 'sswa', Key: filename, Body: file},
         options: {partSize: 5 * 1024 * 1024, queueSize: 10}   // 5 MB
      });
      s3.upload().on('httpUploadProgress', function (evt) {
         console.log(evt);
      }).send(function (err, data) {
         console.log('After Upload: ' + new Date());
         console.log(err, data);
      });
   });
   busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) {
      console.log('Field [' + fieldname + ']: value: ' + inspect(val));
   });
   busboy.on('finish', function() {
      console.log('Done parsing form!');
      res.writeHead(303, { Connection: 'close', Location: '/' });
      res.end();
   });
   req.pipe(busboy);
});

我怀疑它是否真的作为流同时上传到 s3 ?这种方法有什么缺点吗?


为了测试多部分流式上传到 S3 是否有效,我在三个执行点记录了时间日志 -

  1. 在开始从客户端上传之前(上传开始时间)
  2. 上传到EC2后(服务员完成时间)
  3. 转移到S3后(s3UploadFinishTime)

然后我从 EC2 运行。上传各种长度的视频文件(36.1 MB、33.3 MB、52.5 MB)后,我观察到上传到 EC2 的每 5 MB(如我所定义)的部分会立即传输到 S3。将部件上传到 S3 时,您将看到以下行的日志。它将显示文件部分上传进度以及部分编号。

console.log(evt);

对于所有三个上传服务员完成时间 and s3UploadFinishTime相同或几乎没有 1 秒的差异。

例子: 上传 52.5 MB 时

{
  "uploadStartTime": "2016-04-28T14:19:51.365Z",
  "busboyFinishTime": "2016-04-28T14:22:26.292Z",
  "s3UploadFinishTime": "2016-04-28T14:22:26.558Z"
}

完整代码:

router.post('/s3StreamUpload', function(req, res, next) {
   var busboy = new Busboy({headers: req.headers});
   var uploadStartTime = new Date(),
      busboyFinishTime = null,
      s3UploadFinishTime = null;

   busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
      console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype);

      var s3 = new AWS.S3({
         params: {Bucket: 'sswa', Key: filename, Body: file},
         options: {partSize: 5 * 1024 * 1024, queueSize: 10}   // 5 MB
      });
      s3.upload().on('httpUploadProgress', function (evt) {
         console.log(evt);
      }).send(function (err, data) {
         s3UploadFinishTime = new Date();
         if(busboyFinishTime && s3UploadFinishTime) {
            res.json({
               uploadStartTime: uploadStartTime,
               busboyFinishTime: busboyFinishTime,
               s3UploadFinishTime: s3UploadFinishTime
            });
         }
         console.log(err, data);
      });
   });
   busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) {
      console.log('Field [' + fieldname + ']: value: ' + inspect(val));
   });
   busboy.on('finish', function() {
      console.log('Done parsing form!');
      busboyFinishTime = new Date();
      if(busboyFinishTime && s3UploadFinishTime) {
         res.json({
            uploadStartTime: uploadStartTime,
            busboyFinishTime: busboyFinishTime,
            s3UploadFinishTime: s3UploadFinishTime
         });
      }
   });
   req.pipe(busboy);
});

根据我的观察,我相信这是使用 EC2 上部署的 REST API 通过 EC2 将文件上传到 S3 的最佳解决方案之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node JS - 将数据从 Busboy 流式传输到 AWS S3 的相关文章

随机推荐