我正在使用awssdkforphp(laravel),并试图删除一个包含所有对象的s3 bucket。这是我的代码:
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
而不是斜杠。我试过用根水桶(没有斜杠),结果成功了。
你知道怎么把桶的名字弄对吗?
最佳答案
知道了!
我在想,桶只是根。但是在s3中没有文件夹,有一个类似文件夹的结构来简化分类。所有文件都在一个地方,文件名的前缀是路径(即env('S3_BUCKET')
)。
所以我想要的不是删除一个bucket,而是只删除一个文件夹。但由于没有文件夹,我只想删除以/path/to/folder/image.jpg
不管怎样,下面是更新后的代码:
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();
}