【问题标题】:Saving file to AWS S3将文件保存到 AWS S3
【发布时间】:2019-12-06 10:40:58
【问题描述】:

我一直在这里和 Google 上关注一些示例,了解如何编写 Nodejs Lambda 函数以从 URL 获取(音频)文件并将其保存到 S3。到目前为止,我已经做到了:

var AWS = require('aws-sdk');
var https = require('https');
var s3 = new AWS.S3();

const querystring = require('querystring');

exports.handler = function(event, context) {
  const params = querystring.parse(event.body);
  const audioUrl = params['audioUrl'];

  https.get(audioUrl, function(res) {
    var body = '';
    res.on('data', function(chunk) {
      // Agregates chunks
      body += chunk;
    });
    res.on('end', function() {
      // Once you received all chunks, send to S3
      var params = {
        Bucket: 'bucket_name',
        Key: 'filename.wav',
        Body: body
      };
      s3.putObject(params, function(err, data) {
        if (err) {
          console.error("ERROR: ", err, err.stack);
        } else {
          console.log("DATA:", data);
        }
      });
    });
  });
};

这导致文件名为 filename.wav 的文件被保存到 S3 存储桶,但该文件不是我想要的 WAV 音频文件。似乎在从 audioUrl 检索文件并将其保存到 S3 的过程中,文件的格式/编码丢失了。

对此的任何提示或解决方案将不胜感激!

谢谢!

【问题讨论】:

    标签: node.js amazon-s3 aws-lambda


    【解决方案1】:

    您正在将二进制文件转换为字符串,这就是您上传的文件损坏的原因。您需要做的是使用Buffer 而不是string

    const chunks = [];
    res.on('data', function(chunk) {
       // Agregates chunks
       chunks.push(chunk)
    });
    
    res.on('end', function() {
      // Once you received all chunks, send to S3
      var params = {
        Bucket: 'bucket_name',
        Key: 'filename.wav',
        Body: Buffer.concat(chunks)
      };
      s3.putObject(params, function(err, data) {
        if (err) {
          console.error("ERROR: ", err, err.stack);
        } else {
          console.log("DATA:", data);
        }
      });
    });
    

    无论如何,与其缓冲块,不如直接传递流,让 S3 SDK 处理。

    var params = {
      Bucket: 'bucket_name',
      Key: 'filename.wav',
      Body: res // pass the readable stream directly
    };
    
    s3.putObject(params, function(err, data) {});
    

    直接传递流的唯一警告是,库只能处理它可以确定长度的流。如果该请求正确设置了内容长度,则不会有任何问题。

    您可以通过使用s3.upload 来绕过此限制。


    注意:好久没用S3 SDK了,上次我用的时候不支持pipe,直接做:res.pipe(s3.putObject())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2018-04-25
      相关资源
      最近更新 更多