当前位置: 首页 > 知识库问答 >
问题:

使用创建预签名或获取预签名网址将表单数据文件从客户端上载到 S3 由于 CORS 而失败

龚承嗣
2023-03-14

我正在使用React web应用程序,并试图上传一个文件到AWS S3。< br >我在本地(< code>localhost:3000)和部署到生产时(Vercel无服务器功能)都尝试过。

我首先使用 fetch 来检索文件上传的预签名 URL,这非常有效:

module.exports = async (req, res) => {
    let {fileName, fileType} = req.body;
    const post = await s3.createPresignedPost({
        Bucket: BUCKET_NAME,
        Fields: {
            key: fileName
        },
        ContentType: fileType,
        Expires: 60
    });
    res.status(200).json(post);

然后,在第二次提取时:

await fetch(url, {method: 'POST', body: formData}

我得到:

fetch has been blocked by CORS policy: No 'Access-Control-Allow-Origin'

我已设置权限 -

[
    {
        "AllowedHeaders": [
            "*",
            "Content-*"
        ],
        "AllowedMethods": [
            "HEAD",
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "*"
        ]
    }
]

我还验证了代码中的桶名。

我试过:

    < li >两个< code>getPresignedUrl

我已经尝试了所有方法,并浏览了数十篇文章(1,2)并浏览了此处的问题 - 但它仍然不起作用。不是本地的,也不是在生产中。

共有2个答案

岑熙云
2023-03-14

确保文件名与<code>键

const bucketParms = {
  Bucket: "sample-temp-bucket",
  Key: "HeadShot.jpg",
  Expires: 3600,
};

s3.getSignedUrl("putObject", bucketParms, (error, url) => {
  if (error) console.log("error", error);
  if (url) console.log("url", url);
});

在这里,我们可以测试从邮递员或卷曲生成的url

然后我们可以进行一个httpPUT调用。

this.http
  .put(
    "https://sample-temp-bucket.s3.amazonaws.com/HeadShot.jpg?X-Amz-Algorithm=AWS4-HMAC....",
    formData
  )
  .subscribe((response) => {
    console.log("response received is ", response);
  });

而CORS,ExposeHeaders的通配符不接受(至少从控制台),它只使用空数组“exposehaeders”:[]

晏望
2023-03-14

在没完没了地研究了几个小时后,我发现了这个问题
CORS错误的原因是我没有在初始AWS.config中包含区域。更新配置设置。

一旦我添加了< code>region键,CORS错误就解决了:

const AWS = require('aws-sdk');

AWS.config.update({
    accessKeyId: 'XXXXX',
    secretAccessKey: 'XXXXXX',
    region: 'us-west-2', // Must be the same as your bucket
});

const s3Client = new AWS.S3();

由于未配置存储桶区域而返回的错误是CORS,这确实令人困惑和误导。

 类似资料:
  • tl;dr-从浏览器向从服务器(AWS S3)获取的预签名url发出的请求获得,但以下请求获得 这是我负责AWS及其S3服务的服务器端代码: 知道我做错了什么吗?

  • 我正在尝试使用预先签名的URL将文件上传到Amazon的S3。我从生成URL的服务器获取URL https://com-example-mysite.s3-us-east-1.amazonaws.com/userFolder/ImageName?X-Amz安全令牌=xxfoox///xxbarxx= 不幸的是,当我将其传递给Refught2时,它会修改试图将其转换为URL的字符串。我设置了,它解决

  • 我正在开发一个特性,使用Angular/预签名url和API Gateway/lambda生成预签名url将文件上传到S3。 我的工作流描述如下: 从模板中获取选定文件 请求我的api(网关/lambda)使用文件名生成预签名的URL。 const body={filename:this.selectedfile.name}const preSignedUrl=await this.http.po

  • 这里是我的node.js预签名URL的生成 那么我在URL生成或卷曲方面的问题在哪里呢?谢谢

  • 问题内容: 我正在尝试使用预签名的URL将文件上传到Amazon的S3。我从生成URL的服务器获取URL,并将其作为JSON对象的一部分发送给我。我将URL作为字符串获取,如下所示: https://com-example-mysite.s3-us- east-1.amazonaws.com/userFolder/ImageName?X-Amz-Security- Token=xxfooxx%2F

  • 我正试图上传一个媒体文件(图片,任何扩展名jpg/png/jpeg或视频)到aws s3桶,从邮递员我创建了我的预签名url在我的后端如下 这成功地生成了一个url,但我似乎无法使用postman来测试它,这是我如何在postman中调整请求的截图 我所尝试的: 在上面的代码中,我尝试将签名版本v4添加到params中,但它给了我一个错误,说出了意外的关键字。我甚至尝试将其添加到aws配置和s3中