将流数据上传到Amazon S3

时间:2018-03-29 05:45:10

标签: node.js amazon-web-services amazon-s3 fs

我尝试在我的节点应用上将svg二维码推送到S3。

据我所知,我应该将Buffer上传到S3。当我检查qrResult时,我在任何地方都看不到。也许我从根本上误解了writeStreams的概念,以及如何将数据传输到S3上传,但我似乎无法弄清楚这一点......

let fileName = 'qrCode'

let qrCode = Qr.image('The ultimate test', { type: 'svg' }); 
let output = fs.createWriteStream(fileName)
let qrResult = qrCode.pipe(output)



let s3bucket = new Aws.S3({
   accessKeyId: env.AWS_ACCESS_KEY
   secretAccessKey: env.AWS_SECRET,
   Bucket: env.S3_BUCKET_NAME,
});


let params = {
   Bucket: env.S3_BUCKET_NAME,
   Key: fileName,
   Body: qrResult,
 };


s3bucket.upload(params, function (err, qrResult) {
   if (err) {
     console.log('error in callback');
     console.log(err);
   }

   console.log('success');
   console.log(qrResult);
});

2 个答案:

答案 0 :(得分:1)

您可能需要添加ContentType&您的参数中的ACL为:

let params = {
  Bucket: env.S3_BUCKET_NAME,
  Key: fileName,
  Body: qrResult,
  ContentType: 'image/svg+xml',
  ACL: 'public-read'
};

BTW我在代码中看不到file个对象。

同样使用putObject而不是upload,如:

s3bucket.putObject(params...

答案 1 :(得分:0)

密钥表示qrCode的名称,数据是qrCode本身。

所以你可以定义一个创建params的函数,类似的东西:

aws.config.update({
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});
const s3 = new aws.S3({
  params: {
  Bucket: process.env.S3_BUCKET
  }
const data = createParams(name,data);
s3.putObject(data, (err, response) => {....});

createParams(qrName, qrCode) {
let data = {
 Key: file.name,
 Body: file.data,
 ContentType: 'image/svg+xml',
 ACL: 'public-read'
}
 return data
}

数据是您的写入流或qrCode

的输出