AWS S3 - 使用PHP SDK2设置元数据

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中创建受权限制的帐户,并且正在使用应具有对象所有权限的基本帐户.

任何帮助赞赏.

Pau*_*ega 9

好吧,想通了 - 我的语法在两个方面是不正确的.

首先,我使用了不正确的值CopySource.从文档:

CopySource - (字符串) - 源对象的名称和源对象的键名称,以斜杠(/)分隔.必须是URL编码的.

所以在我的情况下'CopySource' => $key,,它应该是,而不是只使用'CopySource' => urlencode($bucket . '/' . $key),.这解释了403错误,因为我基本上告诉API我的源文件只在{key}的{bucket}/{key}中.

第二个问题与特定标头有关 - 在字段中指定Expires和Cache-Control标头会Metadata导致创建特定于Amazon的元值,并带有前缀为的键x-amz-meta-.相反,我现在使用ExpiresCacheControl参数.我最后的工作代码:

$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)