You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP SDK删除AWS S3中的指定"文件夹"及其所有内容?

用PHP SDK实现AWS S3路径下内容的批量删除(模拟rm -rf)

你之前用deleteObject的方法无效,是因为S3没有真正的文件夹概念,deleteObject仅能删除单个对象——包括用来模拟空文件夹的带末尾斜杠的Key,但没法处理路径下的文件和子路径内容。要实现类似rm -rf的效果,需要先列出目标前缀下的所有对象,再批量删除。

以下是两种可行的实现方式:

方法一:手动实现批量删除(适合需要自定义逻辑的场景)

use Aws\S3\S3Client;
use Aws\Exception\AwsException;

// 已完成初始化的S3客户端(你的配置已省略)
$this->client = new S3Client([]);

$bucket = $this->config['bucket'];
// 确保前缀以斜杠结尾,匹配该路径下所有子对象
$targetPrefix = rtrim($name, '/') . '/';

try {
    // 列出前缀下的所有对象(包含所有子路径内容)
    $listResult = $this->client->listObjectsV2([
        'Bucket' => $bucket,
        'Prefix' => $targetPrefix,
        'Delimiter' => '' // 不设置分隔符,避免仅返回当前层级的对象
    ]);

    // 处理空路径情况:仅删除空文件夹标记
    if (empty($listResult['Contents'])) {
        $this->client->deleteObject([
            'Bucket' => $bucket,
            'Key' => $targetPrefix
        ]);
        return;
    }

    // 构建批量删除的对象列表
    $deleteItems = array_map(fn($item) => ['Key' => $item['Key']], $listResult['Contents']);
    // 执行首次批量删除
    $this->client->deleteObjects([
        'Bucket' => $bucket,
        'Delete' => [
            'Objects' => $deleteItems,
            'Quiet' => true // 静默模式减少响应数据
        ]
    ]);

    // 处理分页:当文件数量超过1000时,S3会返回分页标记
    while ($listResult['IsTruncated']) {
        $listResult = $this->client->listObjectsV2([
            'Bucket' => $bucket,
            'Prefix' => $targetPrefix,
            'Delimiter' => '',
            'ContinuationToken' => $listResult['NextContinuationToken']
        ]);

        $deleteItems = array_map(fn($item) => ['Key' => $item['Key']], $listResult['Contents']);
        $this->client->deleteObjects([
            'Bucket' => $bucket,
            'Delete' => [
                'Objects' => $deleteItems,
                'Quiet' => true
            ]
        ]);
    }

} catch (AwsException $e) {
    error_log($e->getMessage());
    throw $e;
}

方法二:使用SDK封装的BatchDelete工具(简洁高效)

SDK提供了BatchDelete类,自动处理分页和批量删除逻辑,代码更简洁:

use Aws\S3\S3Client;
use Aws\S3\BatchDelete;
use Aws\Exception\AwsException;

$this->client = new S3Client([]); // 已初始化的客户端

$bucket = $this->config['bucket'];
$targetPrefix = rtrim($name, '/') . '/';

try {
    // 创建批量删除实例,指定桶和目标前缀
    $batchDelete = new BatchDelete($this->client, $bucket, $targetPrefix);
    // 执行删除
    $batchDelete->delete();
} catch (AwsException $e) {
    error_log($e->getMessage());
    throw $e;
}

关键注意事项

  • 确保你的S3账号拥有s3:ListBucket(列出桶内对象)和s3:DeleteObject(删除对象)权限,否则会触发权限错误。
  • deleteObjects接口一次最多删除1000个对象,两种方法都已处理分页场景,无需额外担心大量文件的情况。
  • 目标路径的前缀必须以斜杠结尾,才能准确匹配该路径下的所有子对象。

内容的提问来源于stack exchange,提问作者Kristi Jorgji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 14:22:47