首页 > 解决方案 > 我无法将文件上传到 AWS S3

问题描述

我正在尝试使用 getSignedUrlPromise () 将文件上传到 AWS S3 以获取访问链接,因为存储桶是完全私有的,我希望它只能通过服务器使用 getSignedUrlPromise () 生成的链接进行访问。

当我尝试对获得的链接进行放置时出现问题,因为我收到以下错误,我还将收到的回复留给您。

在此处输入图像描述

响应 {type: 'cors', url: 'https://atlasfitness-progress.s3.amazonaws.com/IMG...a9a56b532bdfe1a139d5a451&X-Amz-SignedHeaders=host', 重定向: false, status: 400, ok: false, ...}正文:ReadableStreamlocked:false[[Prototype]]:ReadableStreambodyUsed:falseheaders:Headers {}ok:falseredirected:falsestatus:400statusText:“错误请求”类型:“cors”url:“https://atlasfitness-progress.s3.amazonaws。 com/IMG_20210202_100322.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAZGHWWSFL5XOWPRXJ%2F20211011%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20211011T181242Z-Amz-Expes&X签名=88461e762045c9e34e22c7d011ca7b7649700c9da9a56b532bdfe1a139d5a451&X-Amz-SignedHeaders=host"[[原型]]:响应

下面是在 nodeJS 中配置 aws 的代码:

import AWS from 'aws-sdk';

const bucketName = 'atlasfitness-progress';
const region =process.env.AWS_REGION;
const accessKeyId = process.env.AWS_ACCESS_KEY
const secretAccessKey = process.env.AWS_SECRET_KEY

const URL_EXPIRATION_TIME = 60; // in seconds

const s3 = new AWS.S3({
    region,
    accessKeyId,
    secretAccessKey,
    signatureVersion: 'v4'
})

export const generatePreSignedPutUrl = async (fileName, fileType) => {

    const params = ({
        Bucket: bucketName,
        Key: fileName,
        Expires: 60
    })

    const url = await s3.getSignedUrlPromise('putObject', params);

   return url;
}

然后我有一个快速控制器在请求时发送链接:

routerProgress.post('/prepare_s3', verifyJWT, async (req, res) => {
  res.send({url: await generatePreSignedPutUrl(req.body.fileName, req.body.fileType)});
})

export { routerProgress };

但是问题出现在前端,这里的函数首先要求链接,然后尝试将文件上传到 S3。

const upload = async (e) => {
    e.preventDefault();
    await JWT.checkJWT();

    const requestObject = {
        fileName: frontPhoto.name,
        fileType: frontPhoto.type,
        token: JWT.getToken()
    };

    const url = (await axiosReq.post(`${serverPath}/prepare_s3`, requestObject)).data.url;
    //Following function is the one that doesn't work
    const response = await fetch(url, {
      method: "PUT",
      headers: {
        "Content-Type": "multipart/form-data"
      },
      body: frontPhoto
  });
    console.log(response);
}

一切都完成了,我可以说我是 AWS 的新手,所以很可能我在没有意识到的情况下造成了相当严重的错误。因此,如果有人检测到错误或知道我如何使它工作,我将非常感谢您的帮助。

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

解决方案


推荐阅读