node.js - 无法通过预签名 URL 访问 Amazon S3 存储桶中的 PDF 文件
问题描述
我正在学习使用 React 和 Node 从 Amazon S3 下载文件。这个想法是,当我点击客户端的下载按钮时,文件下载应该会自动开始。到目前为止,我已经设法使用下面的代码从后端获取预签名的 URL。
index.js
const express = require("express");
const downloadRoutes = require("./routes/downloadRoutes");
const app = express();
app.use("/api/download", downloadRoutes);
app.listen(5000, () => {
console.log("Server listening on port 5000");
});
路线/下载Routes.js
const express = require("express");
const dotenv = require("dotenv");
const AWS = require("aws-sdk");
dotenv.config();
const router = express.Router();
const s3 = new AWS.S3({
accessKeyID: process.env.AMAZON_ACESS_KEY_ID,
secretAccessKey: process.env.AMAZON_SECRET_ACCESS_KEY,
});
router.get("/", (req, res) => {
s3.getSignedUrl(
"getObject",
{
Bucket: "download-hemanta-cv",
ResponseContentType: "application/pdf",
Key: "CV_Hemanta_Sundaray.pdf",
},
(err, url) => {
console.log("Error", err, "url", url);
if (err) {
next(err);
} else {
res.send(url);
}
}
);
});
module.exports = router;
我面临的问题是,当我将 URL 粘贴到 chrome 中时,我收到以下消息。
在浏览器中打开 URL 时如何查看 PDF 文件?
解决方案
对于发送到较新区域的请求,AWS S3 需要签名 V4。这是文档的链接。
Amazon S3 在所有 AWS 区域都支持签名版本 4,这是一种用于对 AWS 服务的入站 API 请求进行身份验证的协议。目前,在 2014 年 1 月 30 日之前创建的 AWS 区域将继续支持之前的协议 Signature Version 2。2014 年 1 月 30 日之后的任何新区域将仅支持 Signature Version 4,因此对这些区域的所有请求都必须使用 Signature版本 4。
要通过 aws sdk 发送签名请求,我们只需要在初始化对象时设置 signatureVersion。
const s3 = new AWS.S3({
region: 'ap-south-1',
signatureVersion: "v4",
accessKeyID: process.env.AMAZON_ACESS_KEY_ID,
secretAccessKey: process.env.AMAZON_SECRET_ACCESS_KEY
});
推荐阅读
- java - 拖放文件 - TransferHandler vs. DropTarget vs. FileDrop?
- r - 有没有办法证明 R Markdown 上的文本?
- c++ - 是什么让这个解构永远不会被调用
- python - 计算csv文件中有多少个日期实例?
- javascript - 使用 Javascript 重定向类 onclick
- ruby-on-rails - 如何在 Ruby on Rails 应用程序中使用 Amadeus API 在酒店优惠搜索结果中显示酒店评论数据?
- javascript - html2pdf js不提示下载
- mysql - 仅当通过 bash 脚本文件在 mysql 表中存在列时才编写更新查询
- azure - 如果浏览器选项卡处于非活动状态,则 SignalR 连接超时
- java - Java 将 Byte[] 转换为 Blob