将大于 1MB 的文件上传到 s3,出现 cors 错误。请求的资源上不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】将大于 1MB 的文件上传到 s3,出现 cors 错误。请求的资源上不存在“Access-Control-Allow-Origin”标头【英文标题】:uploading file which is larger than 1MB to s3, getting cors error. No 'Access-Control-Allow-Origin' header is present on the requested resource 【发布时间】:2021-03-24 13:04:16 【问题描述】:

我正在尝试使用 express 和 multer 将图像上传到 s3。 我的前端通过 AWS Amplify 部署,后端通过 Elastic Beanstalk 部署。

问题是当我尝试上传小于 1MB 的图像时,它可以正常工作。但如果文件大于 1MB,则会出现以下错误。

“我的前端路由” 访问 “我的后端路由” 处的 XMLHttpRequest 已被 CORS 策略阻止:没有“访问控制允许来源”请求的资源上存在标头。

我以为问题出在 nginx 有限的正文文件大小,所以我更改了它,但事实并非如此。 4mb image file upload gives HTTP 413 error when uploading to production server

这是我的 multer 配置。

import aws from "aws-sdk";
import multer from "multer";
import multers3 from "multer-s3";

const s3 = new aws.S3(
  accessKeyId: process.env.AMAZON_S3_ACCESS_KEY_ID,
  secretAccessKey: process.env.AMAZON_S3_SECRET_ACCESS_KEY,
  region: "ap-southeast-2",
);

const postUpload = multer(
  storage: multers3(
    s3,
    bucket: 'bucket name'///,
    acl: "public-read",
    metadata: (req, file, cb) => 
      cb(null,  fileName: file.fieldname );
    ,
    key: (req, file, cb) => 
      cb(null, Date.now().toString());
    ,
  ),
  limits:  fileSize: 5242880 ,
);

export const postUploadMiddleware = postUpload.array("files", 6);

export const uploadController = (req, res) => 
  console.log(req.files);
  const  files  = req;
  res.json(files);
;

///////
app.post("/api/post/upload", postUploadMiddleware, uploadController);

这是我的错误请求标头

POST /api/post/upload HTTP/1.1
Host: 'host name'///
Connection: keep-alive
Content-Length: 1195613
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLrPlKnjaQZwy7M1Z
Origin: 'frontend url'///
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: 'frontend url'///
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ko-KR;q=0.8,ko;q=0.7

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

这是因为 Nginx 主体大小限制。

我参考了这篇文章并解决了这个问题。

4mb image file upload gives HTTP 413 error when uploading to production server

【讨论】:

【参考方案2】:

从标题开始,设置如下:

  res.setHeader('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT');
  res.setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept, Authorization');

Here 是解决问题的方法。我还建议您在 S3 设置中检查您的 CORS。应该是这样的:

[
    
        "AllowedHeaders": [],
        "AllowedMethods": [
            "GET",
            "POST",
            "PUT",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    
]

【讨论】:

以上是关于将大于 1MB 的文件上传到 s3,出现 cors 错误。请求的资源上不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

CORS 上传文件到 S3,得到 SignatureDoesNotMatch 错误

带有预签名 URL 和 CORS 问题的 S3 上传

由于 CORS,使用 createPresignedPost 或 getPresignedUrl 将 formData 文件从客户端上传到 S3 失败

即使在添加 CORS 配置后,S3 也会出现 CORS 错误

Google App Engine 和 Amazon S3 文件上传

Alamofire 上传失败,文件超过 1MB