gpt4 book ai didi

node.js - 将文件保存到 AWS S3

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:38 25 4
gpt4 key购买 nike

我一直在关注此处和 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 的过程中,文件的格式/编码丢失了。

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

谢谢!

最佳答案

您正在将二进制文件转换为字符串,这就是您上传的文件损坏的原因。您需要做的是使用 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 处理它,而不是缓冲 block 。

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了,但上次我使用它时他们不支持管道,直接执行:res.pipe(s3.putObject())

关于node.js - 将文件保存到 AWS S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59205954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com