4

ec2経由でs3にファイルをアップロードしようとしています。私の最初のアプローチは、ファイルをec2に完全にアップロードしてから、そのファイルをs3にアップロードすることでした。ec2 から s3 への転送時間が時間の無駄になるため、このアプローチは適切ではありません。

現在、私はbusboyアップロードストリームs3アップロードストリームに使用しようとしています。これにより、ec2へのアップロードと、次にec2からs3へのアップロードが、s3の「アップロード」メソッドサポートストリームとしてアップロードボディとして同時に行われます。

ここに私のコードがあります -

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 にアップロードしているのでしょうか? このアプローチの欠点はありますか?

4

2 に答える 2

1

ブラウザから直接 S3 にアップロードしようとしていますか? その場合、ブラウザから S3 への直接アップロードに presigned-put を使用できます。

これは、 minio-jsを使用して署名付き PUT URL を生成する方法です。

s3Client.presignedPutObject('my-bucketname', 'my-objectname', 1000, function(e, presignedUrl) {
  if (e) return console.log(e)
  console.log(presignedUrl)
})

次に、この署名付き URL をブラウザ クライアントに渡します。ブラウザ クライアントは、XMLHttpRequest を使用してファイルを S3 に直接 PUT できます。

于 2016-05-02T14:01:27.680 に答える