Javascript NodeJS从AWS S3 Bucket下载文件
我试图在NodeJS/Express中创建一个端点,用于从AWS S3存储桶下载内容 它工作得很好,我可以在客户端下载文件,但我也可以在网络选项卡中看到流预览,这很烦人 问题 我想知道我所做的是否正确,是否是一种良好的做法。 还想知道在网络选项卡中看到输出流是否正常 如何使用NodeJS/Express将I文件从S3正确地发送到客户端应用程序 我敢肯定其他网站的请求不会让你预览带有“加载响应数据失败”字样的内容Javascript NodeJS从AWS S3 Bucket下载文件,javascript,node.js,amazon-web-services,express,amazon-s3,Javascript,Node.js,Amazon Web Services,Express,Amazon S3,我试图在NodeJS/Express中创建一个端点,用于从AWS S3存储桶下载内容 它工作得很好,我可以在客户端下载文件,但我也可以在网络选项卡中看到流预览,这很烦人 问题 我想知道我所做的是否正确,是否是一种良好的做法。 还想知道在网络选项卡中看到输出流是否正常 如何使用NodeJS/Express将I文件从S3正确地发送到客户端应用程序 我敢肯定其他网站的请求不会让你预览带有“加载响应数据失败”字样的内容 这是我在NodeJS应用程序中从AWS S3获取流文件的步骤: 下载(fileI
这是我在NodeJS应用程序中从AWS S3获取流文件的步骤:
下载(fileId){
const fileObjectStream=app.s3
.getObject({
关键字:fileId
})
.createReadStream();
此.res.set(“内容类型”、“应用程序/八位字节流”);
这是一套(
“内容处置”,
'附件;filename=“”+fileId+”'
);
fileObjectStream.pipe(this.res);
}
我认为问题在于标题:
//this line will set proper header for file and make it downloadable in client's browser
res.attachment(key);
// this will execute download
s3.getObject(bucketParams)
.createReadStream()
.pipe(res);
所以代码应该是这样的(这是我在项目处理文件中以res.attachment或res.json的形式执行的,以防出现错误,这样客户端可以向最终用户显示错误):
我想另一种选择是让NodeJ创建一个签名url,然后将其发送到客户端。然后,客户端可以使用该签名url访问S3内容。这如何触发客户端的下载呢?在客户端,触发文件的是正确的头。在常规HTTP响应中,Content Disposition response标头是一个标头,指示内容是否应在浏览器中内联显示,即作为网页或网页的一部分,或作为本地下载和保存的附件显示。例如内容配置:附件;filename=“whateverIfFileName.jpg”将向浏览器发送下载文件的指示。。。。在我上面的代码中,res.attachment(key)设置了正确的文件头,以便通过浏览器下载文件。我希望这有帮助。
router.route("/downloadFile").get((req, res) => {
const query = req.query; //param from client
const key = query.key;//param from client
const bucketName = query.bucket//param from client
var bucketParams = {
Bucket: bucketName,
Key: key
};
//I assume you are using AWS SDK
s3 = new AWS.S3({ apiVersion: "2006-03-01" });
s3.getObject(bucketParams, function(err, data) {
if (err) {
// cannot get file, err = AWS error response,
// return json to client
return res.json({
success: false,
error: err
});
} else {
res.attachment(key); //sets correct header (fixes your issue )
//if all is fine, bucket and file exist, it will return file to client
s3.getObject(bucketParams)
.createReadStream()
.pipe(res);
}
});
});