gpt4 book ai didi

php - 执行 POST 请求时不会设置 Amazon S3 内容类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:35:28 24 4
gpt4 key购买 nike

AccessDenied 根据策略无效:额外的输入字段:content-type

当我有这个

------WebKitFormBoundaryZIsnhgiAKpAVIsBT
Content-Disposition: form-data; name="acl"

public-read
------WebKitFormBoundaryZIsnhgiAKpAVIsBT
Content-Disposition: form-data; name="awsaccesskeyid"

my-access-key-id
------WebKitFormBoundaryZIsnhgiAKpAVIsBT
Content-Disposition: form-data; name="bucket"

my-bucket
------WebKitFormBoundaryZIsnhgiAKpAVIsBT
Content-Disposition: form-data; name="Content-Type"

image/png
------WebKitFormBoundaryZIsnhgiAKpAVIsBT
Content-Disposition: form-data; name="key"

images/anime_girl.png
------WebKitFormBoundaryZIsnhgiAKpAVIsBT
Content-Disposition: form-data; name="policy"

my-policy
------WebKitFormBoundaryZIsnhgiAKpAVIsBT
Content-Disposition: form-data; name="signature"

my-signature
------WebKitFormBoundaryZIsnhgiAKpAVIsBT
Content-Disposition: form-data; name="success_action_status"

201
------WebKitFormBoundaryZIsnhgiAKpAVIsBT
Content-Disposition: form-data; name="file"; filename="anime_girl.png"
Content-Type: image/png

但是,如果我在下面的代码中完全省略 Content Type,文件会上传但没有正确的内容类型。

        "acl" => "public-read",
"awsaccesskeyid" => $s3->getAwsAccessKeyId(),
"bucket" => $s3->getBucket(),
"Content-Type" => $inputs['type'],
"key" => "images/" . $inputs['name'],
"policy" => $s3->getPolicy(true),
"signature" => $s3->getSignedPolicy(),
"success_action_status" => "201"

我还尝试将内容类型添加到 policy 中,但出现此错误

AccessDenied 根据策略无效:策略条件失败:["starts-with", "Content-Type", "image/png"]

我尝试了一些其他建议并得到了这个错误

AccessDenied 根据策略无效:策略条件失败:["eq", "Content-Type", "image/png"]

这是我的cors配置

<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>

那么我怎样才能以另一种方式指定内容类型或解决这个问题呢?

编辑

当我省略任何类型的内容类型(我没有在后端指定任何类型)时,我得到一个像 Ben 的请求负载

------WebKitFormBoundaryUjxIo0gCBYg7AqJt
Content-Disposition: form-data; name="acl"

public-read
------WebKitFormBoundaryUjxIo0gCBYg7AqJt
Content-Disposition: form-data; name="awsaccesskeyid"

xxxx
------WebKitFormBoundaryUjxIo0gCBYg7AqJt
Content-Disposition: form-data; name="bucket"

xxxxx
------WebKitFormBoundaryUjxIo0gCBYg7AqJt
Content-Disposition: form-data; name="key"

images/Elf-Anime-Warrior-Wallpaper.jpg
------WebKitFormBoundaryUjxIo0gCBYg7AqJt
Content-Disposition: form-data; name="policy"

xxxx
------WebKitFormBoundaryUjxIo0gCBYg7AqJt
Content-Disposition: form-data; name="signature"

0BbpI0AP0wL3S1cBfo9n9tOp+N8=
------WebKitFormBoundaryUjxIo0gCBYg7AqJt
Content-Disposition: form-data; name="success_action_status"

201
------WebKitFormBoundaryUjxIo0gCBYg7AqJt
Content-Disposition: form-data; name="file"; filename="Elf-Anime-Warrior-Wallpaper.jpg"
Content-Type: image/jpeg


------WebKitFormBoundaryUjxIo0gCBYg7AqJt--

问题在于,在存储桶中,文件的内容类型为 binary/octet-stream,因此无法在浏览器中查看图像,而是下载图像(这不是什么我想要)。所以我不确定为什么当我的请求负载看起来像上面那样时亚马逊没有适本地设置内容类型。

最佳答案

根据 Amazon S3 documentation ,您确实可以将 Content-Type 作为表单字段传递,但是 you need to allow that in your policy .

所以你需要这样的东西:

政策:

{
"expiration": "2007-12-01T12:00:00.000Z",
"conditions": [
{"acl": "public-read" },
{"bucket": "johnsmith" },
["starts-with", "$key", "user/eric/"],
["starts-with", "$Content-Type", ""],
...
]
}

这里的相关行是 ["starts-with", "$Content-Type", ""]。文档指出“匹配任何”类型的条件应该是具有空值的“开始于”。例如,如果您想将内容类型限制为某种内容,您应该使用 ["starts-with", "$Content-Type", "image/"]

表格:

(取自 S3 文档的示例,相应地更改值)。

<form action="http://examplebucket.s3.amazonaws.com/" method="post" enctype="multipart/form-data">
<input type="hidden" name="key" value="user/user1/${filename}">
<input type="hidden" name="acl" value="public-read">
<input type="hidden" name="success_action_redirect" value="http://examplebucket.s3.amazonaws.com/successful_upload.html">
<input type="hidden" name="Content-Type" value="binary/octet-stream">
<input type="hidden" name="Policy" value='<Base64-encoded policy string>'>
<input type="hidden" name="x-amz-meta-uuid" value="14365123651274">
<input type="hidden" name="X-Amz-Signature" value="<signature-value>">
<input type="hidden" name="X-Amz-Credential" value="AKIAIOSFODNN7EXAMPLE/20130806/us-east-1/s3/aws4_request">
<input type="hidden" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256">
<input type="hidden" name="X-Amz-Date" value="20130806T000000Z">

Tags for File:
<input type="input" name="x-amz-meta-tag" value=""><br>
File:
<input type="file" name="file"><br>

<input type="submit" name="submit" value="Upload to Amazon S3">
</form>

正如您在第一个有效负载中所做的那样,您确实为表单设置了一个“Content-Type”字段。这与更新后的政策一起应该有效。

不过,作为旁注,如果您事先知道要上传的文件的类型,则应将策略和表单字段都设置为该类型。但是如果你正在上传不同类型的文件,你在策略中设置 Content-Type 条件为“匹配任何”,你可以写一个简单的 javascript 拦截表单的 submit 事件来动态改变Content-Type 字段(此处借助 jQuery 编写):

$("#s3-form").on("submit", function() {
var contentTypeField = $("input[name='Content-Type']", this),
fileField = $("input[type='file']", this),
selectedFiles = fileField.get(0).files;

if (files.length > 0) {
// we're uploading a single file, so get the type for the first selected file
contentTypeField.val(selectedFiles[0].type);
}
});

关于php - 执行 POST 请求时不会设置 Amazon S3 内容类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24987144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com