我解决了这个问题,我将分享自第一篇文章以来我在这里所做的更改,以便上传工作。如有必要,请根据您的需要进行调整。
使用的AWS配置:
- 相同的in-line如第一篇文章中附加到我的用户的策略(请确保您在资源密钥中设置的存储桶名称)
- 没有附加策略的 S3 存储桶
- S3 Bucket所有公共访问均已禁用
这是我用于创建 postObject 的最新 php 代码:
$objectKey = $this->objectKeyGenerator->getObjectKey($object);
$options = [
['bucket' => $this->getBucketName()],
['eq', '$key', $objectKey],
['acl' => 'private']
];
// Optional: configure expiration time string
$expires = '+2 hours';
// Set some defaults for form input fields
$formInputs = [
'acl' => $acl,
'key' => $objectKey
];
$postObject = new PostObjectV4(
$this->getS3Client(),
$this->getBucketName(),
$formInputs,
$options,
$expires
);
// Get attributes to set on an HTML form, e.g., action, method, enctype
$formAttributes = $postObject->getFormAttributes();
// Get form input fields. This will include anything set as a form input in
// the constructor, the provided JSON policy, your AWS access key ID, and an
// auth signature.
$formInputs = $postObject->getFormInputs();
return ['formAttributes' => $formAttributes, 'formInputs' => $formInputs];
与我的第一篇文章相比,postObject 生成有何变化:
- 我不再使用“starts-with”选项并手动生成对象密钥,以便上传的文件只能在生成的密钥上上传(如果给出另一个密钥,则会因为密钥不相等而失败),但我认为这不是导致错误的原因,而且我很确定它将始终与“starts-with”选项一起使用。
-
bucket and acl属性现在位于 $options 数组中,作为 AWS SDK for PHP 开发人员指南中提供的 Create PostObjectV4 示例代码(请参阅 [https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-presigned-post.html] https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-presigned-post.html%5D).
- 在 $formInputs 数组中,key存在,以便我可以将其返回到 postObject 中(因为提交的密钥必须是计算得出的密钥)。我认为这不是强制性的。
我尝试通过删除来重现该错误bucket and acl来自 $option 数组,这导致了“403 Forbidden error”,但有一条消息指出“根据策略无效:额外输入字段:bucket”,我发现这不是很明显......我还没有对此错误进行更多调查。
我还分享了我的 html 表单,自第一篇文章以来,该表单发生了一些变化,输入字段顺序发生了变化,并且根据策略的要求添加了 acl 字段。
<form method="post" action="https://my-bucket.s3.eu-west-3.amazonaws.com/" enctype="multipart/form-data">
<input type="hidden" name="key" value="object/key.txt" /><br />
<input type="hidden" name="acl" value="private"/>
<input type="hidden" name="X-Amz-Credential" value="MYUSERACCESSKEY/20190510/eu-west-3/s3/aws4_request" />
<input type="hidden" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" />
<input type="hidden" name="X-Amz-Date" value="20200108T093921Z" />
<input type="hidden" name="Policy" value='MYBASE64ENCODEDPOLICY' />
<input type="hidden" name="X-Amz-Signature" value="MYSIGNATURE" />
File:
<input type="file" name="file" /> <br />
<!-- The elements after this will be ignored -->
<input type="submit" name="submit"/>
最后,在我原来的帖子中,我没有谈论我的 s3 存储桶公共访问 and policy配置,我认为问题可能就在这里。
希望这对您有所帮助,如有需要,请随时询问详细信息。