11

我想用NodeJS通过浏览器将一些大文件直接上传到s3,目前还不清楚如何准备这个文件以上传到s3。可能有更好的模块(如 Knox)来处理这种情况,但我不确定。有什么想法吗?

文件对象

  file: { 
     webkitRelativePath: '',
     lastModifiedDate: '2013-06-22T02:43:54.000Z',
     name: '04-Bro Safari & UFO! - Animal.mp3',
     type: 'audio/mp3',
     size: 11082039 
  }

S3 放置对象

var params = {Bucket: 'bucket_name/'+req.user._id+'/folder', Key: req.body['file']['name'], Body: ???};
s3.putObject(params, function(err, data) {
    if (err)
      console.log(err);
    else
      console.log("Successfully uploaded data to myBucket/myKey");
});    
4

5 回答 5

18

现在支持流式传输(请参阅文档),只需将流传递为Body

var fs = require('fs');
var someDataStream = fs.createReadStream('bigfile');
var s3 = new AWS.S3({ params: { Bucket: 'myBucket', Key: 'myKey' } });
s3.putObject({ Body: someDataStream, ... }, function(err, data) {
  // handle response
})
于 2016-04-04T12:23:56.127 回答
3

s3.putObject()方法不流式传输,据我所知,s3 模块不支持流式传输。但是,通过Knox,您可以使用Client.putStream(). 使用您问题中的文件对象,您可以执行以下操作:

var fs = require('fs');
var knox = require('knox');

var stream = fs.createReadStream('./file');
var client = knox.createClient({
  key: '<api-key-here>',
  secret: '<secret-here>',
  bucket: 'learnboost'
});

var headers = {
  'Content-Length': file.size,
  'Content-Type': file.type
};

client.putStream(stream, '/path.ext', headers, function(err, res) {
  // error or successful upload
});
于 2013-11-04T04:36:25.997 回答
1

一种选择是改用 multer-s3:https ://www.npmjs.com/package/multer-s3 。

这篇文章也有一些细节:使用 NodeJS 和 Multer 将图像上传到 S3。如何上传整个文件 onFileUploadComplete

于 2015-07-28T01:39:27.430 回答
0

您的代码没有流式传输。您需要查看对pipe某处的调用,或者至少需要使用data事件处理程序手动管道的代码。您可能正在使用 express bodyParser 中间件,它不是流式实现。它将整个请求正文作为临时文件存储在本地文件系统上。

我不会提供具体的建议,因为我从网络搜索“node.js s3 流”中获得了有希望的结果。花 5 分钟阅读,然后发布一个至少尝试流式传输的片段,一旦您在球场上有一些东西,我们可以帮助您做对。

于 2013-11-04T04:37:04.813 回答
0

v3 中,PutObjectCommand 无法将文件流写入 S3。我们需要使用@aws-sdk/lib-storage库来上传缓冲区和流。

例子:

const upload = async (fileStream) => {
    const uploadParams = {
        Bucket    : 'test-bucket',
        Key    : 'image1.png',
        Body: fileStream,
    }

    try {
        const parallelUpload = new Upload({
            client: s3Client,
            params: uploadParams,
        });

        console.log('Report progress..')
        parallelUpload.on("httpUploadProgress", (progress) => {
            console.log(progress);
        });

        await parallelUpload.done();
    } catch (e) {
        console.log(e);
    }
}

参考 - https://github.com/aws/aws-sdk-js-v3/blob/main/UPGRADING.md#s3-multipart-upload

于 2021-08-25T17:19:29.650 回答