
本教程详细介绍了如何使用aws sdk for php在amazon s3桶中获取指定路径下的单层对象列表,模拟目录结构。通过巧妙结合`prefix`和`delimiter`参数,您可以有效地筛选出当前层级的文件夹(commonprefixes)和文件(contents),避免返回深层嵌套的对象,从而实现清晰的目录浏览。
Amazon S3(Simple Storage Service)本质上是一个扁平化的对象存储服务,它不具备传统文件系统中的目录(文件夹)概念。S3中的每个“文件”都被视为一个对象,并通过一个唯一的键(Key)来标识,这个键通常包含对象的完整路径,例如public/uploads/test_company/test1/test.txt。
然而,在实际应用中,我们经常需要像操作文件系统一样,以层级结构来浏览和管理S3桶中的对象,例如只查看某个特定路径下的“子目录”和“文件”,而不深入到更深的层级。AWS SDK提供了listObjects或listObjectsV2 API,配合特定的参数,可以有效地模拟这种层级浏览。
要实现S3桶的单层对象列表,listObjects(或listObjectsV2)API中的两个关键参数是Prefix(前缀)和Delimiter(分隔符)。
Prefix (前缀):
立即学习“PHP免费学习笔记(深入)”;
Delimiter (分隔符):
通过结合这两个参数,我们可以精确地获取指定路径下的第一层子目录和文件。
以下是如何使用AWS SDK for PHP来实现S3桶单层对象列表的示例代码。
假设S3桶中存在以下对象键:
public/uploads/test_company/test1 public/uploads/test_company/test2 public/uploads/test_company/test1/test.txt public/uploads/test_company/file_at_root.jpg
我们的目标是查询public/uploads/test_company/路径下,只获取test1/、test2/(作为子目录)和file_at_root.jpg(作为文件)。
<?php
require 'vendor/autoload.php'; // 确保您已通过Composer安装AWS SDK
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
// 1. 配置您的AWS凭证和区域
// 最佳实践是使用IAM角色或环境变量,避免硬编码凭证
$s3Client = new S3Client([
'version' => 'latest', // 使用最新版本的API
'region' => 'your-aws-region', // 例如 'us-east-1', 'ap-southeast-1'
'credentials' => [
'key' => 'YOUR_AWS_ACCESS_KEY_ID', // 替换为您的Access Key ID
'secret' => 'YOUR_AWS_SECRET_ACCESS_KEY', // 替换为您的Secret Access Key
// 'token' => 'YOUR_AWS_SESSION_TOKEN', // 如果使用临时凭证
],
]);
// 2. 定义桶名、前缀和分隔符
$bucketName = 'your-s3-bucket-name'; // 替换为您的S3桶名称
$prefix = 'public/uploads/test_company/'; // 要查询的路径前缀,注意末尾的斜杠
$delimiter = '/'; // 目录分隔符
echo "正在查询桶 '{$bucketName}' 中路径 '{$prefix}' 下的单层对象...\n";
try {
// 3. 调用 listObjects 方法
$result = $s3Client->listObjects([
'Bucket' => $bucketName, // 必需:S3桶名称
'Prefix' => $prefix, // 限制结果为指定前缀下的对象
'Delimiter' => $delimiter, // 启用目录模拟功能
// 'MaxKeys' => 1000, // 可选:限制每次返回的对象数量,默认1000
// 'Marker' => '<string>', // 可选:用于分页,从指定键之后开始返回
]);
// 4. 处理返回结果:CommonPrefixes (子目录)
if (isset($result['CommonPrefixes'])) {
echo "\n当前层级子目录:\n";
foreach ($result['CommonPrefixes'] as $commonPrefix) {
// CommonPrefixes['Prefix']会包含完整的目录路径,例如 'public/uploads/test_company/test1/'
echo "- " . $commonPrefix['Prefix'] . "\n";
}
} else {
echo "\n当前层级没有子目录。\n";
}
// 5. 处理返回结果:Contents (当前层级的文件)
if (isset($result['Contents'])) {
echo "\n当前层级文件:\n";
foreach ($result['Contents'] as $object) {
// 排除与Prefix完全相同的Key(通常表示一个空目录本身)
// 并且确保对象键在Prefix之后不包含Delimiter,以确认它是当前层级的文件
$relativeKey = substr($object['Key'], strlen($prefix));
if (!empty($relativeKey) && strpos($relativeKey, $delimiter) === false) {
echo "- " . $object['Key'] . " (大小: " . $object['Size'] . " 字节, 上次修改: " . $object['LastModified'] . ")\n";
}
}
} else {
echo "\n当前层级没有直接文件。\n";
}
} catch (AwsException $e) {
// 捕获并输出任何AWS SDK相关的异常
echo "查询S3对象时发生错误: " . $e->getMessage() . "\n";
}
?>根据上述代码和示例对象键:
listObjects方法将返回:
CommonPrefixes:
Contents:
因此,代码将输出:
正在查询桶 'your-s3-bucket-name' 中路径 'public/uploads/test_company/' 下的单层对象... 当前层级子目录: - public/uploads/test_company/test1/ - public/uploads/test_company/test2/ 当前层级文件: - public/uploads/test_company/file_at_root.jpg (大小: XXX 字节, 上次修改: YYY)
通过巧妙地结合AWS SDK for PHP的listObjects方法中的Prefix和Delimiter参数,您可以有效地在Amazon S3桶中模拟传统文件系统的目录结构,实现单层对象的精确列表。这种方法不仅有助于清晰地浏览S3数据,也是构建S3文件管理界面或自动化脚本的基础。理解S3的扁平化存储本质以及这些参数的工作原理,是高效利用S3的关键。
以上就是PHP实现AWS S3桶单层对象(目录)列表的教程的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号