Php 将多个具有不同元数据的对象放入AmazonS3失败

Php 将多个具有不同元数据的对象放入AmazonS3失败,php,amazon-web-services,amazon-s3,Php,Amazon Web Services,Amazon S3,我有一个文件信息数组,正在循环使用AWS PHP 2 skd将这些文件的内容上传到云中,在我尝试添加元数据之前,它都工作得非常出色,在这一点上,它将元数据添加到创建的第一个对象中,但之后我得到以下错误消息: 致命错误:未捕获Aws\S3\Exception\SignatureDesNotMatch异常:Aws错误代码:SignatureDesNotMatch,状态代码:403,Aws请求ID:8FC9360F2EB687EE,Aws错误类型:客户端,Aws错误消息:我们计算的请求签名与您提供的签

我有一个文件信息数组,正在循环使用AWS PHP 2 skd将这些文件的内容上传到云中,在我尝试添加元数据之前,它都工作得非常出色,在这一点上,它将元数据添加到创建的第一个对象中,但之后我得到以下错误消息:

致命错误:未捕获Aws\S3\Exception\SignatureDesNotMatch异常:Aws错误代码:SignatureDesNotMatch,状态代码:403,Aws请求ID:8FC9360F2EB687EE,Aws错误类型:客户端,Aws错误消息:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法,用户代理:aws-sdk-php2/2.2.1 Guzzle/3.3.1 curl/7.24.0 PHP/5.3.13在第89行的D:\Inetpub\wwwroot\ThirdParty\u Resources\aws\u SDK2\aws\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);
}

因此,第二次循环时,它似乎因为不同的元值而爆炸。当元数据相同时,循环执行时不会出现问题。任何帮助/指针都很好。

您可能会将该方法与

从SDK的2.4版开始,就可以使用
上传
助手方法。使用
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++;
}

杰里米欢呼着,然而,这一点运气都没有。我为每个S3函数都提供了一个包装器,它依次从S3客户端调用实际需要的功能。因此,我希望创建一个新函数,其中包含对这个上载函数的调用,但是,当我这样做时,当我在访问函数中调用$this->client->upload时,它就爆炸了。在S3结构中的AWS PHP 2文件中,我找不到处理此功能的实际函数,即使它在正式的Amazon文档页面上有文档记录。很可能您的SDK副本不是最新的。我将更新我的答案,提供更多细节和另一个示例。完成。putObject的第二个示例应该可以在不需要更新任何内容的情况下运行。感谢Jeremy的回复,我已经更新到2.4.2,但不幸的是,现在什么都不起作用了!:(它抱怨找不到bucket名称,尽管它在2.2.1《噩梦》中运行得很好。无论如何,我已经在数据库中存储了指向云文件的元数据,所以我暂时不想在滴答滴答的时候为此烦恼。不过感谢您的回复,并尝试帮助我解决这个问题。奇怪。我不知道为什么它对您不起作用。如果您发现任何问题,请务必报告: