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

奥古兹·吉拉尔

我正在使用适用于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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

删除 AWS S3 存储桶时权限不足,无法列出存储桶“XXXX”的对象

从 AWS S3 存储桶中删除对象(不在代码中)

如何删除aws s3存储桶中具有相同键的多个对象

AWS S3 存储桶中对象更新的问题

AWS S3存储桶删除

如果使用 aws-sdk 已经存在具有相同密钥的对象,则覆盖 S3 存储桶中的对象

无法使用ruby aws-sdk v2在S3中创建存储桶

AWS:无法通过s3存储桶策略授予s3访问权限

AWS S3 getObject无法通过PHP SDK读取对象内容

Spring Boot + AWS S3:无法删除存储桶中的文件

AWS S3:在一次调用中从版本化存储桶中删除对象的所有版本

AWS S3 版本控制开启:我可以从我的存储桶中删除所有对象吗?

如何使用 AWS SDK for Go v2 删除非空 S3 存储桶

通过 AWS SDK 从 AWS S3 存储桶下载文件会损坏文件

如何使用AWS C ++ SDK解析区域,存储桶和对象键的S3 URI?

删除存储桶AWS中的对象

AWS S3:无法从具有公共访问权限的存储桶中获取非拥有对象(通过非身份验证方式)

AWS S3 + Ruby SDK:如何列出存储桶

AWS-由于位置限制,无法通过HTTPS端点访问S3存储桶

通过AWS CLI同步后,AWS S3存储桶中的文件不公开

在 Clojurescript 中,如何使用 AWS javascript SDK 列出 S3 存储桶?

如何从 aws-sdk 中的 s3 存储桶创建 Elastic Beanstalk 实例?

如何在Scala或Java中模拟或存根AWS SDK S3存储桶调用?

从 AWS S3 存储桶中删除对象时,我们需要提供完整的 URL 还是只需要提供 S3 存储桶中的文件名

通过CloudFormation的AWS Lambda S3存储桶通知

AWS S3错误的存储桶对象

如何使用AWS CLI删除S3存储桶中的多个文件

如何使用CLI在AWS S3中删除版本存储桶?

列出AWS S3存储桶中的对象(使用无服务器部署)