【问题标题】:How to upload a WAV file to S3 from the /tmp folder in AWS Lambda using Node.js如何使用 Node.js 从 AWS Lambda 中的 /tmp 文件夹将 WAV 文件上传到 S3
【发布时间】:2018-04-28 02:14:56
【问题描述】:

我已经成功创建了一个 AWS Lambda 函数来使用 sox 处理一些音频并将结果存储到 /tmp 文件夹。我想将结果文件上传到 S3。我尝试了多种方法,但没有得到它的工作。这是我的功能:

const lambdaAudio = require('lambda-audio')
const fs = require('fs')

exports.handler = function(event, context) {

  lambdaAudio.sox('./input.mp3 -c 1 /tmp/output.wav')
    .then(response => {
        if (fs.existsSync('/tmp/output.wav')) {
              console.log('output.wav file exists.')  // This works!

              // UPLOAD TO S3 HERE  HOW???

        }            
    })
    .catch(errorResponse => {
      console.log('Error from the sox command:', errorResponse)
    })
}

更新: 这是我的最终工作版本,包含 dpwrussell 的答案:

var lambdaAudio = require('lambda-audio')
var fs = require('fs')
var AWS = require('aws-sdk');

var accessKeyId =  "xxxxxxxxxxxxxxxxxxxxx";
var secretAccessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

AWS.config.update({
  accessKeyId: accessKeyId,
  secretAccessKey: secretAccessKey
});

exports.handler = function(event, context) {

  lambdaAudio.sox('./input.mp3 -c 1 /tmp/output.wav')
    .then(response => {
        if (fs.existsSync('/tmp/output.wav')) {
              console.log('output.wav file exists.')  

              uploadToS3();

        }            
    })
    .catch(errorResponse => {
      console.log('Error from the sox command:', errorResponse)
    })
}

function uploadToS3() {
  fs.readFile('/tmp/output.wav', function (err, data) {
    if (err) { throw err; }

    var base64data = new Buffer(data, 'binary');

    var s3 = new AWS.S3();
    s3.putObject({
      Bucket: 'my-bucket',
      Key: 'output.wav',
      Body: base64data
    },function (resp) {
      console.log('Done');
    });

  });
}

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    只需使用 S3 API。 Lamba 函数角色需要上传到此 S3 存储桶的权限。

    var AWS = require('aws-sdk');
    fs.readFile('/tmp/output.wav', function (err, data) {
      if (err) { throw err; }
    
      var base64data = new Buffer(data, 'binary');
    
      var s3 = new AWS.S3();
      s3.putObject({
        Bucket: 'mybucket',
        Key: 'output.wav'
        Body: base64data
      },function (resp) {
        console.log('Done');
      });
    
    });
    

    【讨论】:

    • 我尝试将此添加到我的代码中,但我得到“TypeError:无法读取未定义的属性'putObject'”。有关代码,请参阅上面的更新。
    • 我的错字,是s3.putObject,而不是s3.client.putObject。在答案中更正。
    • 优秀。谢谢你。有用!我在上面的原始问题下发布了更新。
    猜你喜欢
    • 2021-03-18
    • 2021-04-19
    • 2022-11-03
    • 2020-06-22
    • 2019-03-30
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多