我正在使用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();
    }

10-06 12:56
查看更多