繁体   English   中英

AWS S3无法通过PHP SDK删除存储桶中的对象

[英]AWS S3 cannot delete objects in bucket via PHP SDK

我正在使用AWS SDK for PHP(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 \\ n SignatureDoesNotMatch我们计算的请求签名(截断...)\\ n SignatureDoesNotMatch(客户端):我们计算的请求签名与您提供的签名不匹配。 检查您的密钥和签名方法。 - \\ n SignatureDoesNotMatch我们计算的请求签名与您提供的签名不匹配。 检查您的密钥和签名方法。

基本上它是一个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();
    }

雅S3是一个对象存储,所以没有实际的文件夹。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM