大家好,所以我试图在 nodejs 中提出这种类型的请求。我假设您可以使用 multer 来完成,但有一个主要问题我不想下载文件或从表单上传它我想直接从 s3 中提取它,获取对象并将其作为文件与其他数据到我的路线。有可能这样做吗?
问问题
491 次
2 回答
0
是的,这是完全可能的。假设您了解aws-sdk
.
示例:(辅助方法)
getDataFromS3(filename, bucket, callback) {
var params = {
Bucket: bucket,
Key: filename
};
s3.getObject(params, function(err, data) {
if (err) {
callback(true, err.stack); // an error occurred
}
else {
callback(false, data); //success in retrieving data.
}
});
}
您的路线:
app.post('/something', (req, res) => {
var s3Object = getDataFromS3('filename', 'bucket', (err, file) => {
if(err) {
return res.json({ message: 'File retrieval failed' });
}
var routeProperties = {};
routeProperties.file = file;
routeProperties.someOtherdata = req.body.someOtherData;
return res.json({routeProperties});
});
});
当然,代码可能并不完全正确。但这是一种你可以用来得到你想要的东西的方法。希望这可以帮助。
于 2019-08-19T14:16:26.227 回答
0
我在这里看到两种方法,您可以:
- 通过管道将此请求传递给用户,这意味着您仍然下载并传递它,但您不会将其保存在任何地方,只需通过您的后端流式传输即可。
这里有一个非常相似的问题:Streaming file from S3 with Express,包括有关长度和文件类型的信息
我只是要复制和粘贴代码片段,仅供参考如何完成
function sendResponseStream(req, res){
const s3 = new AWS.S3();
s3.getObject({Bucket: myBucket, Key: myFile})
.createReadStream()
.pipe(res);
}
- 如果文件太大而您无法轻松处理,请在 S3 中创建预签名 URL 并发送它。然后,用户可以在有限的时间内直接从 S3 自己下载文件,更多详细信息请参见:https ://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html
于 2019-08-19T14:12:38.417 回答