AWS S3 存储桶管理:PHP SDK 教程

admin 2024-01-20 796 阅读 0评论

Amazon Web Services (AWS) 简单存储服务 (S3) 是一种高度可扩展的对象存储服务,可从网络上任何位置存储和检索任何大小或类型的数据。AWS S3 具有广泛的用途,包括托管文件供公共访问、存储敏感数据以及为应用程序提供持久存储。

在 AWS S3 中,每个数据项都被视为一个对象,这些对象被组织在称为存储桶的容器中。存储桶充当有效存储和管理对象的逻辑容器。AWS S3 提供了一系列功能,允许您对这些对象执行操作,例如创建新对象、读取其内容、更新其属性或在不再需要时删除它们。

AWS S3 的一个令人兴奋的方面是它与多种编程语言和平台兼容。在本文中,我们将深入探讨如何通过 PHP 客户端利用 AWS S3 的强大功能。

安装适用于 PHP 的 AWS 开发工具包

要开始使用适用于 PHP 的 AWS 开发工具包,请确保您的开发环境已满足以下先决条件:

  • PHP 版本 5.3.3 或更高版本,并已编译 CuRL 扩展。
  • Composer 包管理器。

强烈建议使用 Composer 安装适用于 PHP 的 AWS 开发工具包,因为它比手动获取源代码更简单。

要使用 Composer 安装 SDK,请运行以下命令:

composer require aws/aws-sdk-php

官方包存储库可在以下位置找到:

https://packagist.org/packages/aws/aws-sdk-php

不要忘记在您的项目中包含 Composer 依赖项 vendor/autoload.php

设置客户端

要使用 S3 客户端,您需要使用您的 AWS 凭据对其进行初始化。

// 使用您的 AWS 凭据设置 S3 客户端
$client = new S3Client([
    'version' => 'latest',
    'region' => 'us-east-1',
    'credentials' => [
        'key' => AWS_KEY,
        'secret' => AWS_SECRET,
    ],
]);

存储桶操作

要使用 S3 客户端执行基本的 S3 存储桶操作,您需要使用 $client 变量。以下代码片段演示了如何实现此目的:

创建存储桶:

该 createBucket() 方法用于创建新的 S3 存储桶。它需要指定存储桶的名称。

$client->createBucket(['Bucket' => $bucketName,]);

将对象上传到存储桶:

该 putObject() 方法用于将对象(文件或数据)上传到指定的 S3 存储桶。它需要指定存储桶的名称、对象的名称和对象的内容。

$client->putObject([    'Bucket' => $bucketName,    'Key'    => $objectKey,    'Body'   => $objectContent,]);

获取客户端中的所有存储桶:

要检索与 S3 客户端关联的所有存储桶的列表,请使用listBuckets方法。

$buckets = $client->listBuckets();

// $buckets 结果可以采用以下格式:
Array (
    [0] => Array (
        [Name] => example-bucket-1
        [CreationDate] => DateTime Object ( /* Creation date and time */ )
    )
    [1] => Array (
        [Name] => example-bucket-2
        [CreationDate] => DateTime Object ( /* Creation date and time */ )
    )
    // 如果有其他储存桶
)

返回值是一个数组,其中每个元素对应一个存储桶。数组元素包含存储桶的名称和创建日期。

对象分页、过滤和选择

Amazon S3 是一个对象存储服务,而不是文件系统。存储桶包含对象,而不是文件和目录。这些对象按其键的字母顺序列出。

AWS S3 SDK 中提供了一个重要的方法 listObjectsV2(),它允许您对 S3 存储桶中的对象进行分页、过滤和选择。下面详细介绍该方法的用法并对所涉及的基本参数进行解释。

// 调用 `listObjectsV2()` 方法
$objects = $client->listObjectsV2($listObjectsParams);

Bucket 参数是必需参数,指定 S3 存储桶的名称。

<?php
// 必需参数
$listObjectsParams = [
    'Bucket' => 'YOUR_BUCKET_NAME',
];
?>

您还可以根据需要包含其他参数来过滤对象:

<?php
// 'Delimiter'用于分组对象键的字符
$listObjectsParams['Delimiter'] = '/';
 
// 'Prefix'指定对象键必须具有的前缀
$listObjectsParams['Prefix'] = '/GENRE_FOLDER/2026';
 
//‘StartAfter’ 指定对象键必须在指定对象键之后
$listObjectsParams['StartAfter'] = '/GENRE_FOLDER/2026/GENRE_SONG_2.mp3';

//‘MaxKeys’限制返回的对象数
$listObjectsParams['MaxKeys'] = '20';
?>

结果采用以下格式:

$objects = $client->listObjectsV2($listObjectsParams);

// result
$objects = { 
  Contents:[ { Key: '/GENRE_FOLDER/2026/GENRE_SONG_3.mp3' } ],
  CommonPrefixes: [ { Prefix: '/GENRE_FOLDER/2026' } ],
  Name: 'example',
  Prefix: '',
  MaxKeys: 20,
  Delimiter: '/',
  IsTruncated: false 
}

Amazon S3 不是文件系统,但可以通过使用适当的参数来模拟文件系统行为

可以单独使用以下函数:

// 返回对象键的前缀作为文件夹名称
function getFolderNames($objects)
{
    $folderNames = [];
    foreach ($objects['CommonPrefixes'] ?? [] as $cp) {
        $folderNames[] = $cp['Prefix'];
    }
    return $folderNames;
}

// 返回对象的总大小
function getSize($objects)
{
    $totalSize = 0;
    foreach ($objects as $object) {
        $totalSize += $object['Size'];
    }
    return $totalSize;
}

生成预签名 URL 访问 S3 存储桶文件夹

预签名 URL 是带有编码签名的 URL,允许在有限时间内访问指定资源。

在 PHP 中,您可以使用适用于 PHP 的 AWS 开发工具包轻松生成这些 URL。

以下是生成用于下载 AWS S3 对象的预签名 URL 的函数示例:

function getObjectDownloadURL($client$bucketName$objectKey$objectName)
{
    $cmd = $client->getCommand('GetObject', [
        'Bucket' => $bucketName,
        'Key' => $objectKey,
        'ResponseContentDisposition' => urlencode("attachment; filename=$objectName"),
    ]);
    $request = $client->createPresignedRequest($cmd'+7 days');
    $url = (string) $request->getUri();
    return $url;
}

// 返回从对象返回的预签名 URL 数组
function getObjectsDownloadURLs($client$objects$filterParams)
{
    try {
        $filterByText = $filterParams["ByText"] ?? "";
        $filterByMaxKeys = $filterParams["ByMaxKeys"] ?? "";

        // 对过滤文本进行转义
        $filterByText = htmlspecialchars($filterByText, ENT_QUOTES, 'UTF-8');

        $objectIndex = 0;
        $urlsAsync = [];

        // 遍历对象并根据条件进行过滤
        foreach ($objects['Contents'] as $object) {
            $objectKey = $object['Key'];

            // 跳过目录和隐藏文件
            if (substr($objectKey, -1) === '/' || substr(strrchr($objectKey'/'), 1, 1) === '.') {
                continue;
            }

            $tmp = explode('/'$objectKey);
            $objectName = end($tmp);

            // 跳过与过滤文本不匹配的对象
            if (!stripos($objectName$filterByText) !== false) {
                continue;
            }

            $objectIndex++;

            // 跳过超过指定最大值的对象
            if ($objectIndex < 0 || $objectIndex > $filterByMaxKeys) {
                continue;
            }

            // 为对象生成预签名 URL
            $cmd = $client->getCommand('GetObject', [
                'Bucket' => $bucketName,
                'Key' => $objectKey,
                'ResponseContentDisposition' => urlencode("attachment; filename=$objectName"),
            ]);

            $request = $client->createPresignedRequest($cmd'+7 days');
            $urlValue = (string) $request->getUri();
            $url = [$urlValue$objectKey];
            $urlsAsync[] = $url;
        }

        // 返回预签名 URL 数组
        return $urlsAsync;
    } catch (AwsException $e) {
        // 在发生异常时返回 null
        return null;
    }
}

此 PHP 代码段利用 AWS 开发工具包创建安全的预签名 URL,允许用户在有限的时间内从 AWS S3 存储桶下载对象。您可以自定义 ResponseContentDisposition 选项来指定下载对象的文件名。此外,您可以灵活地调整到期日期,如下所示:

$request = $client->createPresignedRequest($cmd'+2 weeks');

从 AWS 存储桶中压缩 S3 对象

由于 AWS S3 不是文件系统,因此它不提供将对象压缩并返回为 zip 的功能。但是,您可以使用本机 ZipArchive 类将对象的预签名 URL 下载到压缩的 zip 中。

以下是使用 ZipArchive 类将 S3 对象压缩到 zip 文件的示例代码:

function downloadAndCompressUrls($urls$zipFileName)
{
    // 创建新的 ZipArchive 实例
    $zip = new ZipArchive();

    // 打开 zip 文件以进行写入
    if ($zip->open($zipFileName, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
        return null; // 无法打开 zip 文件
    }

    try {
        // 循环下载每个 URL 并将其添加到 zip 文件中
        foreach ($urls as $url) {
            // 尝试下载文件内容
            $fileContent = @file_get_contents($url[0]);

            // 如果下载成功,则将文件添加到 zip 存档中,并使用 URL 中派生的名称
            if ($fileContent !== false) {
                $zip->addFromString(basename($url[1]), $fileContent);
            }
        }

        // 关闭 zip 存档
        $zip->close();

        // 返回创建的 zip 文件的路径
        return $zipFileName;
    } catch (Exception $e) {
        // 处理异常(例如下载或添加文件失败)
        return null;
    }
}

配置跨域资源共享 (CORS)

跨域资源共享 (CORS) 是一种机制,允许 Web 应用程序从与其不相同的域请求资源。在 S3 存储桶中配置 CORS 设置允许您控制允许哪些 Web 域访问您的 S3 资源。

以下是 CORS 配置 JSON 的示例:

{
    "CORSRules": [
        {
            "AllowedHeaders": ["*"],
            "AllowedMethods": ["GET"],
            "AllowedOrigins": ["https://locahost:8000"]
        }
    ]
}

您可以使用这些属性来控制允许哪些 Web 域访问您的 S3 资源以及它们可以如何访问这些资源。

喜欢就支持以下吧
点赞 0

发表评论

快捷回复: 表情:
aoman baiyan bishi bizui cahan ciya dabing daku deyi doge fadai fanu fendou ganga guzhang haixiu hanxiao zuohengheng zhuakuang zhouma zhemo zhayanjian zaijian yun youhengheng yiwen yinxian xu xieyanxiao xiaoku xiaojiujie xia wunai wozuimei weixiao weiqu tuosai tu touxiao tiaopi shui se saorao qiudale qinqin qiaoda piezui penxue nanguo liulei liuhan lenghan leiben kun kuaikule ku koubi kelian keai jingya jingxi jingkong jie huaixiao haqian aini OK qiang quantou shengli woshou gouyin baoquan aixin bangbangtang xiaoyanger xigua hexie pijiu lanqiu juhua hecai haobang caidao baojin chi dan kulou shuai shouqiang yangtuo youling
提交
评论列表 (有 0 条评论, 796人围观)

最近发表

热门文章

最新留言

热门推荐

标签列表