我正在使用适用于PHP的AWS开发工具包(Laravel),并且正在尝试删除包含所有对象的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));
}
当我运行此代码时,出现错误:
在\“ https://s3-us-west-2.amazonaws.com/syndcate-media%2Fsyndcate-uploads%2Fsyndcate-32?delimiter=%2F&encoding-type=url \”上执行\“ ListObjects \”时出错;AWS HTTP错误:客户端错误:
GET https://s3-us-west-2.amazonaws.com/syndcate-media%2Fsyndcate-uploads%2Fsyndcate-32?delimiter=%2F&encoding-type=url
导致403 Forbidden
响应:\ n \ nSignatureDoesNotMatch
我们计算的请求签名(被截断了...)\ n SignatureDoesNotMatch(客户端):我们计算出的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。-\ nSignatureDoesNotMatch
我们计算出的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
基本上,这是一个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();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句