AWS S3Client->getObject()
永远不会返回并且永远不会抛出异常。我怀疑其他S3Client方法在给出一个不存在的密钥时会遇到同样的问题。
但是,如果我使用'debug' => true
配置S3Client,则在找不到文件时会抛出Aws\S3\Exception\S3Exception
,这是可以接受的。
这是我写的一个测试案例:
protected function _test_s3_client_get($unit, $key) {
$provider = CredentialProvider::ini(NULL, APPPATH . 'config/aws.ini');
$provider = CredentialProvider::memoize($provider);
$client = new S3Client([
'region' => 'us-east-1',
'version' => '2006-03-01',
'credentials' => $provider,
// 'debug' => ['logfn' => [$this, '_noop']]
// 'debug' => true,
]);
try {
$result = $client->getObject(array(
'Bucket' => 'mybucket',
'Key'=> $key,
));
} catch (S3Exception $e) {
error_log($e);
}
$unit->run(isset($result['Body']), true, "Got $key");
}
如果'debug' => true
,S3Client会在响应中转储大量数据,无论它是否找到该文件。作为一种解决方法,我可以设置debug
选项以使用调试输出调用空函数。然而,这似乎不是一个永久的解决方案。
还有其他人遇到过这个问题吗?有更好的解决方法吗?
答案 0 :(得分:0)
我们使用"aws/aws-sdk-php": "2.8.22"
,在这种情况下我们有异常NoSuchKeyException
。这是我们的代码:
private function fileExists($bucket, $key)
{
try {
$o = $this->s3->getObject([
'Bucket' => $bucket,
'Key' => $key,
]);
return $o;
} catch (\Aws\S3\Exception\NoSuchKeyException $e) {
return false;
}
}
"aws/aws-sdk-php" "3.20.13"
中唯一的区别是它不会NoSuchKeyException
而是Aws\S3\Exception\S3Exception
。
顺便说一句,检查您的存储桶政策。我的政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ACZ",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::my.own.bucket/*"
}
]
}
答案 1 :(得分:0)
在进行任何操作之前,您可以使用此功能检查密钥(文件名)是否存在。
$ doesFileExist = $ client-> doesObjectExist($ bucket,$ key);
这是对还是错