php - AWS S3 php-sdk“putObjectAcl”的正确语法
问题描述
我的任务是弄清楚 AWS PHP sdk 的工作原理,以便我们可以使用它来为我们的 Web 服务器托管客户图像数据。我已经能够成功测试创建、管理和加载数据到存储桶的大部分功能,但是当我尝试查看内容时,我得到“拒绝访问”。
进入管理控制台,我想出了如何设置权限,这样我就可以使用特定的主机规则或通过设置存储桶和对象都可以读取来查看文件。
但是,无论我如何尝试遵循 PHP sdk [有限] 文档中的示例,我似乎都无法使用亚马逊提供的 php 代码设置 ACL 值。
他们的示例只是列出了各种值的位置,我尝试在其中填写我的存储桶、对象和帐户的相关数据,但它不起作用。我试过做一个getObjectAcl
和发回类似于收到的东西的东西,但它不起作用。我尝试过在线查看示例,但我发现的很少内容不起作用。
这是我尝试过的最新示例:
$params = [
'ACL' => 'public-read',
'AccessControlPolicy' => [
'Grants' => [
[
'Grantee' => [
'DisplayName' => 'Owner',
'ID' => $awsId,
'Type' => "CanonicalUser"
],
'Permission' => "FULL_CONTROL"
],
[
'Grantee' => [
'DisplayName' => 'All Users',
'URI' => "http://acs.amazonaws.com/groups/global/AllUsers",
'Type' => "Group"
],
'Permission' => "READ"
],
],
'Owner' => [
'ID' => $awsId
]
],
'Bucket' => "our-test-bucket",
'Key' => "800x600.jpg"
];
$result = $awsSdk->getS3Client()->putObjectAcl($params);
结果输出:
致命错误:未捕获的异常 'Aws\S3\Exception\S3Exception' 并带有消息“在“ https://our-test-bucket.s3.us-east-2.amazonaws.com/800x600.jpg 上执行“PutObjectAcl”时出错? acl "; AWS HTTP 错误:客户端错误:
PUT https://our-test-bucket.s3.us-east-2.amazonaws.com/800x600.jpg?acl
导致第 191 行的 /project/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.phpAws\S3\Exception\S3Exception:在“ https://our-test-bucket.s3.us-east-2.amazonaws.com/800x600.jpg?acl ”上执行“PutObjectAcl”时出错;AWS HTTP 错误:客户端错误:
PUT https://our-test-bucket.s3.us-east-2.amazonaws.com/800x600.jpg?acl
导致400 Bad Request
响应:MalformedACLError
您提供的 XML 不正确(截断...) MalformedACLError(客户端):您提供的 XML 格式不正确或未针对我们发布的架构进行验证 -MalformedACLError
您提供的 XML 格式不正确或未针对我们发布的架构进行验证B24661919936C2DADft/******************************** ***************= 在第 191 行的 /project/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php
解决方案
我设法将跟踪放到 guzzle html messageTrait withHeader() 函数中,这样我就可以在 php 流中查看传出的 xml。然后,我将结果与我在谷歌搜索的各个地方找到的 xml 示例进行了比较,并通过比较的反复试验,我将问题追溯到 Group Grant 中的'DisplayName' => 'All Users'。删除该行,它似乎工作。
$pubAcl = [
'Owner' => [
'ID' => $awsId,
'DisplayName' => 'Owner'
],
'Grants' => [
[
'Grantee' => [
'ID' => $awsId,
'DisplayName' => 'Owner',
'Type' => "CanonicalUser"
],
'Permission' => "FULL_CONTROL"
],
[
'Grantee' => [
'URI' => "http://acs.amazonaws.com/groups/global/AllUsers",
'Type' => "Group"
],
'Permission' => "READ"
]
]
];
(订单更改是测试的结果,但结果不是问题)
推荐阅读
- php - 如何将 curl 响应值插入数据库
- java - RabbitMQ - DefaultConsumer 内部通道
- python - pyspark - 使用 createDataFrame 在 json 流数据中查找最大值和最小值
- json - 无法将特殊字符发布到对话流查询中
- node.js - 当我尝试通过在表单中输入的数据编辑 API URL 并从 API 获取数据时,代码不起作用
- java - 我可以使用 ssh 运行 java jar 程序吗?
- string - 在触发 _Change 事件之前验证 TextBox
- html - 如何将三个 div 贴在一起?
- html - 如何修复我的菜单,我还想要下拉元素的空间(白色背景的元素)?
- android - 隐式广播接收器的白名单上是否有广播 DATA_SMS_RECEIVED?