首页 > 解决方案 > 如何将 .wav 从 lambda 函数中的 URL 保存到 s3 存储桶

问题描述

我有一个 .wav 文件的网址。我想将它从 Lambda 函数保存到 S3 存储桶。我必须先下载它吗?

最好的方法是什么?

exports.handler = async (event) => {
  // imports
  const fs = require('fs');
  const AWS = require('aws-sdk');
  AWS.config.update({ region: process.env.REGION || 'us-east-1' })
  const s3 = new AWS.S3();


  // get URL
  const body = parseBody(event['body']);
  const url = body.url;

  // download file?
  // HOW TO DO THIS using async?
  const file_name = magic_save(url)

  // upload to S3
  var bucketName =  `some_bucket`;
  var keyName = 'audio.wav';
  const fileContent = fs.readFileSync(file_name);
  var params = { 'Bucket': bucketName, 'Key': keyName, 'Body': fileContent };
  try {
      console.log('saving...');
      const data = await s3.putObject(params).promise();
      console.log("Successfully saved object to " + bucketName + "/" + keyName);
      } catch (err) {
          console.log('err');
          console.log(err);

      };

标签: node.jsamazon-web-servicesamazon-s3aws-lambda

解决方案


最好是像这样将文件直接流式传输到 s3

const got = require("got");
const aws = require("aws-sdk");
const s3Client = new aws.S3();
const Bucket = 'somebucket';
const Key = "some/audio.wav";

exports.handler = async (event) => {
  // get URL
  const body = parseBody(event['body']);
  const url = body.url;

  const stream = got.stream(url);
  const response = await s3Client.upload({Bucket, Key, Body: stream}).promise();
  console.log(response);
};


推荐阅读