7. 文件管理

在AWS S3中,用户可以通过一系列的接口管理桶(Bucket)中的文件(Object),比如ListObjects,DeleteObject,CopyObject,DoesObjectExist等。

7.1. 列出桶中的文件

您可以使用S3Client::listObjects列出存储中间中的文件:

<?php

/**
* @param $s3Client S3Client实例
* @param $bucket 桶名
*/
function listAllObjects($s3Client, $bucket){
    for ($i = 0; $i < 100; $i += 1) {
        $s3Client->putObject([
            'Bucket'=>$bucket,
            'Key'=>"dir/obj" . strval($i),
            'Body'=> 'hi'
        ]);
    }
    $prefix = 'dir/';
    $delimiter = '/';
    $nextMarker = '';
    $maxKeys = 2;
    while (true) {
        try {
            $listObjectInfo = $s3Client->listObjects(['Bucket'=>$bucket,
                'Delimiter' => $delimiter,
                'Prefix' => $prefix,
                'MaxKeys' => $maxKeys,
                'Marker' => $nextMarker,]);
        } catch (AwsException $e) {
            printf(__FUNCTION__ . ": FAILED\n");
            printf($e->getMessage() . "\n");
            return;
        }
        var_dump($listObjectInfo);
        //得到nextMarker,从上一次listObjects读到的最后一个文件的下一个文件开始继续获取文件列表
        $nextMarker = $listObjectInfo['NextMarker'];
        echo "nextMarker" . $nextMarker . "\n";
        if ($nextMarker === null) {
            break;
        }
    }

}

上述代码中的数据筛选参数如下所示:

参数 说明
Delimiter 用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素
Prefix 限定返回的object key必须以prefix作为前缀。注意使用prefix查询时,返回的key中仍会包含prefix
MaxKeys 限定此次返回object的最大数,如果不设定,默认为100
Marker 设定结果从marker之后按字母排序的第一个开始返回

Note

上述表中的参数都是可选参数

7.2. 判断文件是否存在

您可以使用S3Client::doesObjectExist判断文件是否存在:

<?php

/**
* @param $S3Client S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
*/
function doesObjectExist($s3Client, $bucketName,$objectName)
{
    try{
        $exist = $s3Client->doesObjectExist($bucketName, $objectName);
    } catch(\Aws\Exception\AwsException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
    var_dump($exist);
}

7.3. 删除单个文件

您可以使用S3Client::deleteObject删除单个需要删除的文件:

<?php

/**
* @param $nosClient S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
*/
function deleteObject($s3Client, $bucketName,$objectName)
{
    try{
        $s3Client->deleteObject(['Bucket'=>$bucketName, 'Key'=>$objectName]);
    } catch(AwsException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}

7.4. 删除多个文件

您可以使用S3Client::deleteObjects批量删除文件:

<?php
/**
 * 批量删除object
 *
 * @param S3Client $S3Client S3Client实例
 * @param string $bucket bucket名字
 * @return null
 */
function deleteObjects($S3Client, $bucket)
{
    $objects = array();
    $objects[] = "nos-php-sdk-test/upload-test-object-name.txt";
    $objects[] = "nos-php-sdk-test/upload-test-object-name.txt.copy";
    try{
        $S3Client->deleteObjects($bucket, $objects);
    } catch(AwsException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}

Attention

该接口目前不兼容,暂时不可用

7.5. 拷贝文件

您可以使用S3Client::copyObject拷贝文件:

/**
* @param $s3Client
* @param $srcBucketName
* @param $srcObjectName
* @param $destBucketName
* @param $destObjectName
*/
function copyObject($s3Client,$srcBucketName,$srcObjectName,$destBucketName,$destObjectName){
    try{
        $s3Client->copyObject(['Bucket'=>$destBucketName,'Key'=>$destObjectName,
            'CopySource'=>'/' . $srcBucketName . '/' . $srcObjectName]);
    } catch (\Aws\Exception\AwsException $exception){
        echo $exception->getMessage() . "\n";
    }
}

Attention

  1. 支持跨桶的文件copy

7.6. 修改文件元信息

暂时不提供此类方法

7.7. 获取文件的文件元信息

您可以使用S3Client::getObjectMeta获取对象的元数据信息:

<?php
/**
* @param $s3Client   S3Client实例
* @param $bucketName 桶名
* @param $objectName 对象名
*/
function getObjectMeta($s3Client,$bucketName,$objectName){
    try{
        $result = $s3Client->headObject(['Bucket'=>$bucketName,'Key'=>$objectName]);
        echo $result . "\n";
        echo $result['ContentLength'];
    } catch (\Aws\Exception\AwsException $exception){
        echo $exception->getMessage() . "\n";
    }
}

Attention

  1. 获取的元数据通过一个array返回,返回值为HTTP头类型的元数据与用户自定义元数据
  2. 元数据名均为小写

7.8. 生成私有云对象可以下载的URL链接

您可以使用S3Client::getCommand获取对象可下载URL:

<?php
/**
* @param $s3Client
* @param $bucketName
* @param $objectName
*/
function generatePresignedUrl($s3Client, $bucketName, $objectName){
    $cmd = $s3Client->getCommand('GetObject', [
        'Bucket' => $bucketName,
        'Key'    => $objectName
    ]);

    $request = $s3Client->createPresignedRequest($cmd, '+20 hours'); // minutes,hours


    // Get the actual presigned-url
    $presignedUrl = (string) $request->getUri();
    echo $presignedUrl;
}