使用php列出Amazon S3存储桶中所有文件的快速方法?

2022-08-30 21:07:31

我有一个亚马逊s3存储桶,其中包含数万个文件名。获取列出存储桶中所有文件名的所有文件或文本文件列表的最简单方法是什么?

我试过,但它似乎只列出了1000个文件。listObject()

amazon-s3-仅返回 1000 个条目-用于一个存储桶-和-全部用于另一个存储桶-u S3-提供程序-不从存储桶中获取超过 1000 个项目

--> 列出密钥 使用适用于 PHP 的 AWS 开发工具包,但在 aws 文档中我已阅读

最大键 - 字符串 - 可选 - 方法调用返回的最大结果数。返回的列表将不包含超过指定值的结果,但返回的结果可能更少。默认值为 1000。

适用于 list_objects 的 AWS 文档

有没有办法列出所有内容并使用 AWS PHP 开发工具包将其打印到文本文件中?

可能的重复:快速列出所有文件在亚马逊s3存储桶中

我已经重新发布了这个问题,因为我正在寻找php中的解决方案。

法典:

$s3Client = S3Client::factory(array('key' => $access, 'secret' => $secret));

$response = $s3Client->listObjects(array('Bucket' => $bucket, 'MaxKeys' => 1000, 'Prefix' => 'files/'));
$files = $response->getPath('Contents');
$request_id = array();
foreach ($files as $file) {
    $filename = $file['Key'];
    print "\n\nFilename:". $filename;

 }

答案 1

要获取超过 1000 个对象,您必须使用该参数发出多个请求,以告知 S3 您为每个请求离开的位置。使用适用于 PHP 的 AWS 开发工具包的迭代器功能可以更轻松地获取所有对象,因为它封装了发出多个 API 请求的逻辑。试试这个:Marker

$objects = $s3Client->getListObjectsIterator(array(
    'Bucket' => $bucket,
    'Prefix' => 'files/'
));

foreach ($objects as $object) {
    echo $object['Key'] . "\n";
}

使用最新的 PHP SDK(截至 2016 年 3 月),代码必须按如下方式编写:

$objects = $s3Client->getIterator('ListObjects', array(
    'Bucket' => $bucket,
    'Prefix' => 'files/'
));

答案 2

使用分页器获取所有文件

    $client = new S3Client([
        'version' => AWS_S3_CLIENT_FACTORY_VERSION,
        'region' => AWS_S3_CLIENT_FACTORY_REGION,

    ]);
    $objects = $client->getPaginator('ListObjects', ['Bucket' => "my-bucket"]);
    foreach ($objects as $listResponse) {
        $items = $listResponse->search("Contents[?starts_with(Key,'path/to/folder/')]");
        foreach($items as $item) {
            echo $item['Key'] . PHP_EOL;
        }
    }

要获取所有文件,请将搜索更改为:

$listResponse->search("Contents[*]");

推荐