gpt4 book ai didi

node.js - 使用适用于 Node.js/Restify 的 AWS 开发工具包通过 POST 将数据上传到 S3

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

我正在尝试弄清楚如何通过我在 Node.js/Restify 中编写的 RESTful API 将数据上传到 Amazon S3 存储桶。我认为我已经掌握了所有有效的基本概念,但是当我连接到 POST 请求的正文时,事情就出了问题。当我设置回调函数以简单地将字符串传递到 S3 时,它工作得很好,并且在适当的 S3 存储桶中创建了文件:

function postPoint(req, res, next) {

var point = [
{ "x": "0.12" },
{ "y": "0.32" }
];

var params = { Bucket: 'myBucket', Key: 'myKey', Body: JSON.stringify(point) };

s3.client.putObject(params, function (perr, pres) {
if (perr) {
console.log("Error uploading data: ", perr);
} else {
console.log("Successfully uploaded data to myBucket/myKey");
}
});

res.send(200);
return next();
}

server.post('/point', postPoint);

显然,我最终需要从请求正文中流式传输/通过管道传输我的请求。我假设我需要做的就是简单地将参数主体切换到请求流:

function postPoint(req, res, next) {

var params = { Bucket: 'myBucket', Key: 'myKey', Body: req };

s3.client.putObject(params, function (perr, pres) {
if (perr) {
console.log("Error uploading data: ", perr);
} else {
console.log("Successfully uploaded data to myBucket/myKey");
}
});

res.send(200);
return next();
}

但这最终导致显示以下日志消息:“上传数据时出错:[TypeError:路径必须是字符串]”,这几乎没有告诉我需要做什么来修复错误。最终,我希望能够通过管道传输结果,因为发送的数据可能非常大(我不确定前面的示例是否导致正文存储在内存中),所以我认为这样的事情可能会起作用:

function postPoint(req, res, next) {

var params = { Bucket: 'myBucket', Key: 'myKey', Body: req };

req.pipe(s3.client.putObject(params));

res.send(200);
return next();
}

因为我在 GET 函数中做了类似的事情,效果很好:(s3.client.getObject(params).createReadStream().pipe(res);)。但这也不起作用。

此时我有点不知所措,因此我们将不胜感激!

最佳答案

所以,我在 AWS 开发者论坛上发帖后终于找到了答案。事实证明,我的 S3 请求中缺少 Content-Length header 。 Loren@AWS总结得很好:

In order to upload any object to S3, you need to provide a Content-Length. Typically, the SDK can infer the contents from Buffer and String data (or any object with a .length property), and we have special detections for file streams to get file length. Unfortunately, there's no way the SDK can figure out the length of an arbitrary stream, so if you pass something like an HTTP stream, you will need to manually provide the content length yourself.

建议的解决方案是简单地从 http.IncomingMessage 对象的 header 传递内容长度:

var params = {
Bucket: 'bucket', Key: 'key', Body: req,
ContentLength: parseInt(req.headers['content-length'], 10)
};
s3.putObject(params, ...);

如果有人有兴趣阅读整个线程,您可以访问它 here .

关于node.js - 使用适用于 Node.js/Restify 的 AWS 开发工具包通过 POST 将数据上传到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16609635/

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