Pau*_*ega 5 php amazon-s3 amazon-web-services
我正在尝试使用AWS PHP SDK2更改S3上特定存储桶中所有对象的元数据.我在使用新SDK找到一个具体的例子时遇到了麻烦,但是拼凑了以下内容:
$OBJ_aws_s3 = S3Client::factory($config);
$objects = $OBJ_aws_s3->getIterator('ListObjects', array(
'Bucket' => $bucket,
'MaxKeys' => 10
));
foreach($objects as $object) {
$key = $object['Key'];
echo "Processing " . $key . "\n";
$response = $OBJ_aws_s3->copyObject(array(
'Bucket' => $bucket,
'Key' => $key,
'CopySource' => $key,
'Metadata' => array(
'Cache-Control' => 'max-age=94608000',
'Expires' => gmdate('D, d M Y H:i:s T', strtotime('+3 years'))
),
'MetadataDirective' => 'REPLACE',
));
}
Run Code Online (Sandbox Code Playgroud)
该foreach环成功遍历给定$桶的前10项,但我得到的403错误copyObject()操作:
Uncaught Aws\S3\Exception\AccessDeniedException: AWS Error Code: AccessDenied, Status Code: 403
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是由于将不正确的值传递给copyObject或S3中的某些设置.请注意,我尚未在IAM中创建受权限制的帐户,并且正在使用应具有对象所有权限的基本帐户.
任何帮助赞赏.
好吧,想通了 - 我的语法在两个方面是不正确的.
首先,我使用了不正确的值CopySource.从文档:
CopySource - (字符串) - 源对象的名称和源对象的键名称,以斜杠(/)分隔.必须是URL编码的.
所以在我的情况下'CopySource' => $key,,它应该是,而不是只使用'CopySource' => urlencode($bucket . '/' . $key),.这解释了403错误,因为我基本上告诉API我的源文件只在{key}的{bucket}/{key}中.
第二个问题与特定标头有关 - 在字段中指定Expires和Cache-Control标头会Metadata导致创建特定于Amazon的元值,并带有前缀为的键x-amz-meta-.相反,我现在使用Expires和CacheControl参数.我最后的工作代码:
$OBJ_aws_s3 = S3Client::factory($config);
$objects = $OBJ_aws_s3->getIterator('ListObjects', array(
'Bucket' => $bucket,
'MaxKeys' => 10
));
foreach($objects as $object) {
$key = $object['Key'];
echo "Processing " . $key . "\n";
$response = $OBJ_aws_s3->copyObject(array(
'Bucket' => $bucket,
'Key' => $key,
'CopySource' => urlencode($bucket . '/' . $key),
'CacheControl' => 'max-age=94608000',
'Expires' => gmdate('D, d M Y H:i:s T', strtotime('+3 years')),
'MetadataDirective' => 'COPY',
));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4607 次 |
| 最近记录: |