代码之家  ›  专栏  ›  技术社区  ›  Mose

如何使用节点将WAV文件从AWS Lambda中的/tmp文件夹上载到S3。js公司

  •  1
  • Mose  · 技术社区  · 7 年前

    我已经成功地创建了一个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');
        });
    
      });
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   dpwr    7 年前

    只需使用S3API即可。lamba函数角色需要权限才能上载到此S3 bucket。

    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');
      });
    
    });