Javascript 使用POST从浏览器直接将文件上载到S3

Javascript 使用POST从浏览器直接将文件上载到S3,javascript,amazon-web-services,amazon-s3,Javascript,Amazon Web Services,Amazon S3,与这个问题类似: 我已经设置了一个Cloudfront发行版,它具有一个可以访问S3源的源访问标识 S3有一个CORS配置,允许从任何来源进行PUT、POST、GET等操作。Cloudfront正在将源站、访问控制请求头和访问控制请求方法头转发到S3源站 我使用Dropzone js库配置了一个到Cloudfront端点的上传后请求 响应:不允许使用405方法 和响应标题: 访问控制允许方法HEAD、GET、PUT、POST 访问控制允许源* 允许HEAD、DELETE、GET、PUT 服务

与这个问题类似:

我已经设置了一个Cloudfront发行版,它具有一个可以访问S3源的源访问标识

S3有一个CORS配置,允许从任何来源进行PUT、POST、GET等操作。Cloudfront正在将源站、访问控制请求头和访问控制请求方法头转发到S3源站

我使用Dropzone js库配置了一个到Cloudfront端点的上传后请求

响应:不允许使用405方法

和响应标题:

  • 访问控制允许方法HEAD、GET、PUT、POST
  • 访问控制允许源*
  • 允许HEAD、DELETE、GET、PUT
  • 服务器AmazonS3
  • 来自cloudfront的x-cache错误
如果我将请求方法切换为“PUT”,则上载响应成功

200行

  • x-cache:cloudfront未命中
  • 访问控制允许方法HEAD、GET、PUT、POST
神秘的“允许””标题现在丢失

PUT请求之后在S3中结束的文件不可读。我在尝试下载时遇到访问被拒绝的错误

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
我不确定S3是否隐式拒绝POST请求。只要PUT请求有效,那就好了

CORS配置:

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
s3:*就是尝试让它开始工作

为什么不允许将POST发送到S3源站? 为什么上载的文件已损坏/不可读

我也尝试过类似于下面方法的预签名URL,但面临类似的问题。POST被拒绝,PUT被拒绝访问。我在多个桶上试过这个。它唯一的工作方式是启用公共写入。

编辑: 这个问题非常相似,但似乎没有得到解决。

为什么不允许将POST发送到S3源站

POST
不支持使用OAI在CloudFront中请求S3源站

发件人:

不支持POST请求

为什么不允许将POST发送到S3源站

POST
不支持使用OAI在CloudFront中请求S3源站

发件人:

不支持POST请求


上载的文件未损坏。您的IAM用户无权调用Head对象,即元数据。您是否可以尝试使用s3 all access帐户来确认这是一个访问问题?我相信我用来检查的密钥以及控制台访问帐户都具有完全访问权限。我创建了bucket,在S3中没有我不能做的事情。除非我用这种方法上传文件。此外,打开公共读取不会让我访问上载的文件上载的文件没有损坏。您的IAM用户无权调用Head对象,即元数据。您是否可以尝试使用s3 all access帐户来确认这是一个访问问题?我相信我用来检查的密钥以及控制台访问帐户都具有完全访问权限。我创建了bucket,在S3中没有我不能做的事情。除非我用这种方法上传文件。另外,打开公共阅读并不能让我访问上传的文件,这就解释了这一点。链接页面还讨论了通过Cloudfront到S3的PUT请求所需的“x-amz-content-sha256”头。这是我第一次看到这个要求,但它可能解释了这个问题的另一部分。@comfytoday我不确定放置对象时损坏的数据。正如您所注意到的,可能是缺少了一些标题。这就解释了这一点。链接页面还讨论了通过Cloudfront到S3的PUT请求所需的“x-amz-content-sha256”头。这是我第一次看到这个要求,但它可能解释了这个问题的另一部分。@comfytoday我不确定放置对象时损坏的数据。正如您所注意到的,可能是缺少了一些标题。
{
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXX"
            },
            "Action": [
                "s3:*",
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::example-bucket.net/*"
}