首页 > 解决方案 > 无法通过预签名 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 文件?

标签: node.jsamazon-web-servicesamazon-s3

解决方案


对于发送到较新区域的请求,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 
});

推荐阅读