将多个对象放入具有不同元数据的Amazon S3中会失败

时间:2013-08-08 10:34:41

标签: php amazon-web-services amazon-s3

我已经获得了一系列文件信息,这些信息正在循环使用并使用AWS PHP 2 skd将这些文件的内容上传到云端,这一切都运行良好,直到我尝试添加元数据,这一点,它将元数据添加到创建的第一个对象,但之后我收到以下错误消息:

  

致命错误:未捕获的Aws \ S3 \ Exception \ SignatureDoesNotMatchException:AWS错误代码:SignatureDoesNotMatch,状态代码:403,AWS请求ID:8FC9360F2EB687EE,AWS错误类型:客户端,AWS错误消息:我们计算的请求签名不匹配你提供的签名。检查你的密钥和签名方法。,用户代理:aws -sdk-php2 / 2.2.1 Guzzle / 3.3.1 curl / 7.24.0 PHP / 5.3.13抛出D:\ Inetpub \ wwwroot \ ThirdParty_Resources \ AWS_SDK2 \ aws第89行的\ aws-sdk-php \ src \ Aws \ Common \ Exception \ NamespaceExceptionFactory.php

我已经从我的循环中裁剪了代码以突出显示顽皮的区域。

foreach($aFiles as $aFile) {
$arr_ObjectMeta = array(
    'OriginalFileName'  => $aFile['FileName']
,   'Description'       => $aFile['FileDesc']
,   'Keywords'      => $aFile['FileKeyW']
);

// get the file to upload
$obj_FileUpload = $obj_S3->putObject($sBucket, $sBucketFolder . $sFilenameToSave, $sFile, 'public-read', $arr_ObjectMeta);
if($obj_FileUpload) {
    $files_uploaded++;
} else {
    $files_not_uploaded++;
}

// clear the file upload S3 response object
unset($obj_FileUpload);

// delete the downloaded file
unlink($sServerUploadFolder.$sFilenameToSave);
}

所以第二次围绕循环,它似乎因为不同的元值而轰炸。当元数据相同时,循环执行没有问题。任何帮助/指针都会很棒。

1 个答案:

答案 0 :(得分:1)

您可能会将putObject method方法与upload helper method混淆。

自SDK版本2.4起,upload帮助程序方法可用。使用upload方法,您可以执行以下操作:

try {
    $sKey = $sBucketFolder . $sFilenameToSave;
    $obj_FileUpload = $obj_S3->upload($sBucket, $sKey, $sFile, 'public-read', array(
        'Metadata' => $arr_ObjectMeta
    ));
    $files_uploaded++;
} catch (\Aws\S3\Exception\S3Exception $e) {
    $files_not_uploaded++;
}

你也可以使用putObject方法做同样的事情,它只是稍微冗长。

try {
    $obj_FileUpload = $obj_S3->putObject(array(
        'Bucket'     => $sBucket
        'Key'        => $sBucketFolder . $sFilenameToSave,
        'SourceFile' => $sFile,
        'ACL'        => 'public-read'
        'Metadata'   => $arr_ObjectMeta
    ));
    $files_uploaded++;
} catch (\Aws\S3\Exception\S3Exception $e) {
    $files_not_uploaded++;
}