AWS S3 无法通过 PHP SDK 删除存储桶中的对象
AWS S3 cannot delete objects in bucket via PHP SDK
我正在为 PHP (Laravel) 使用 AWS SDK,我正在尝试删除一个包含所有对象的 S3 存储桶。这是我的代码:
public function deleteBucket($syndcateid){
$s3client = AWS::createClient('s3');
$bucket = env('S3_BUCKET')."/syndcate-uploads/syndcate-".$syndcateid;
$listObjectsParams = ['Bucket' => $bucket];
$batchDelete = BatchDelete::fromListObjects($s3client, $listObjectsParams);
$batchDelete->delete();
$s3client->deleteBucket(array('Bucket' => $bucket));
$s3client->waitUntil('BucketNotExists', array('Bucket' => $bucket));
}
当我 运行 这段代码时,我得到错误:
Error executing \"ListObjects\" on \"https://s3-us-west-2.amazonaws.com/syndcate-media%2Fsyndcate-uploads%2Fsyndcate-32?delimiter=%2F&encoding-type=url\"; AWS HTTP error: Client error: GET https://s3-us-west-2.amazonaws.com/syndcate-media%2Fsyndcate-uploads%2Fsyndcate-32?delimiter=%2F&encoding-type=url
resulted in a 403 Forbidden
response:\n\nSignatureDoesNotMatch
The request signature we calcul (truncated...)\n SignatureDoesNotMatch (client): The request signature we calculated does not match the signature you provided. Check your key and signing method. - \nSignatureDoesNotMatch
The request signature we calculated does not match the signature you provided. Check your key and signing method.
基本上这是一个 SignatureDoesNotMatch
错误,其发生的原因是 URL 中的斜线没有被解码,因为请求 URL (https://s3-us-west-2.amazonaws.com/syndcate-media%2Fsyndcate-uploads%2Fsyndcate-32
) 似乎有 %2F
而不是斜杠。
我尝试使用根存储桶(没有斜线),它成功了。
知道如何正确获取存储桶名称吗?
知道了!
我在想什么,桶只是 env('S3_BUCKET')
,那是根。但是S3里面没有文件夹,有一个类似文件夹的结构,方便分类。所有文件都在一个地方,文件名以路径为前缀(即 /path/to/folder/image.jpg
)。
所以我想要的不是删除存储桶,而是删除文件夹。但是因为没有文件夹,我只想删除前缀为 path/to/folder/
的文件
无论如何,这是更新后的代码:
public function deleteBucket($syndcateid){
$s3client = AWS::createClient('s3');
$startsWith = "syndcate-uploads/syndcate-".$syndcateid."/";
$listObjectsParams = ['Bucket' => env('S3_BUCKET'), 'Prefix'=>$startsWith, 'Delimiter'=>'/'];
$batchDelete = BatchDelete::fromListObjects($s3client, $listObjectsParams);
$batchDelete->delete();
}
ya S3 是一个对象存储,因此没有实际的文件夹。
我正在为 PHP (Laravel) 使用 AWS SDK,我正在尝试删除一个包含所有对象的 S3 存储桶。这是我的代码:
public function deleteBucket($syndcateid){
$s3client = AWS::createClient('s3');
$bucket = env('S3_BUCKET')."/syndcate-uploads/syndcate-".$syndcateid;
$listObjectsParams = ['Bucket' => $bucket];
$batchDelete = BatchDelete::fromListObjects($s3client, $listObjectsParams);
$batchDelete->delete();
$s3client->deleteBucket(array('Bucket' => $bucket));
$s3client->waitUntil('BucketNotExists', array('Bucket' => $bucket));
}
当我 运行 这段代码时,我得到错误:
Error executing \"ListObjects\" on \"https://s3-us-west-2.amazonaws.com/syndcate-media%2Fsyndcate-uploads%2Fsyndcate-32?delimiter=%2F&encoding-type=url\"; AWS HTTP error: Client error:
GET https://s3-us-west-2.amazonaws.com/syndcate-media%2Fsyndcate-uploads%2Fsyndcate-32?delimiter=%2F&encoding-type=url
resulted in a403 Forbidden
response:\n\nSignatureDoesNotMatch
The request signature we calcul (truncated...)\n SignatureDoesNotMatch (client): The request signature we calculated does not match the signature you provided. Check your key and signing method. - \nSignatureDoesNotMatch
The request signature we calculated does not match the signature you provided. Check your key and signing method.
基本上这是一个 SignatureDoesNotMatch
错误,其发生的原因是 URL 中的斜线没有被解码,因为请求 URL (https://s3-us-west-2.amazonaws.com/syndcate-media%2Fsyndcate-uploads%2Fsyndcate-32
) 似乎有 %2F
而不是斜杠。
我尝试使用根存储桶(没有斜线),它成功了。
知道如何正确获取存储桶名称吗?
知道了!
我在想什么,桶只是 env('S3_BUCKET')
,那是根。但是S3里面没有文件夹,有一个类似文件夹的结构,方便分类。所有文件都在一个地方,文件名以路径为前缀(即 /path/to/folder/image.jpg
)。
所以我想要的不是删除存储桶,而是删除文件夹。但是因为没有文件夹,我只想删除前缀为 path/to/folder/
无论如何,这是更新后的代码:
public function deleteBucket($syndcateid){
$s3client = AWS::createClient('s3');
$startsWith = "syndcate-uploads/syndcate-".$syndcateid."/";
$listObjectsParams = ['Bucket' => env('S3_BUCKET'), 'Prefix'=>$startsWith, 'Delimiter'=>'/'];
$batchDelete = BatchDelete::fromListObjects($s3client, $listObjectsParams);
$batchDelete->delete();
}
ya S3 是一个对象存储,因此没有实际的文件夹。