本文介绍如何在开启版本控制状态下列举存储空间下(Bucket)的所有文件(Object)、指定个数的文件、指定前缀的文件等。

列举Bucket中所有Object的版本信息

以下代码用于列举examplebucket中包括删除标记(Delete Marker)在内的所有Object的版本信息。

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);

try{
    $option = array(
        OssClient::OSS_KEY_MARKER => null,
        OssClient::OSS_VERSION_ID_MARKER => null
    );
    $bool = true;
    while ($bool){
        $result = $ossClient->listObjectVersions($bucket,$option);
        // 查看Object的版本信息。
        foreach ($result->getObjectVersionList() as $key => $info){
            printf("key name: {$info->getKey()}\n");
            printf("versionid: {$info->getVersionId()}\n");
            printf("Is latest: {$info->getIsLatest()}\n\n");
        }

        // 查看删除标记的版本信息。
        foreach ($result->getDeleteMarkerList() as $key => $info){
            printf("del_maker key name: {$info->getKey()}\n");
            printf("del_maker versionid: {$info->getVersionId()}\n");
            printf("del_maker Is latest: {$info->getIsLatest()}\n\n");
        }

        if($result->getIsTruncated() === 'true'){
            $option[OssClient::OSS_KEY_MARKER] = $result->getNextKeyMarker();
        $option[OssClient::OSS_VERSION_ID_MARKER] = $result->getNextVersionIdMarker();
        }else{
            $bool = false;
        }
    }
} catch(OssException $e) {
    printf($e->getMessage() . "\n");
    return;
}

列举指定前缀Object的版本信息

以下代码用于列举examplebucket中以test为前缀Object的版本信息。

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);

try{
    $option = array(
        OssClient::OSS_KEY_MARKER => null,
        OssClient::OSS_VERSION_ID_MARKER => null,
        // 指定列举以"test"为前缀Object的版本信息。
        OssClient::OSS_PREFIX => "test"
    );
    $bool = true;
    while ($bool){
        $result = $ossClient->listObjectVersions($bucket,$option);
        // 查看Object的版本信息。
        foreach ($result->getObjectVersionList() as $key => $info){
            printf("key name: {$info->getKey()}\n");
            printf("versionid: {$info->getVersionId()}\n");
            printf("Is latest: {$info->getIsLatest()}\n\n");
        }

        // 查看删除标记的版本信息。
        foreach ($result->getDeleteMarkerList() as $key => $info){
            printf("del_maker key name: {$info->getKey()}\n");
            printf("del_maker versionid: {$info->getVersionId()}\n");
            printf("del_maker Is latest: {$info->getIsLatest()}\n");
        }

        if($result->getIsTruncated() === 'true'){
            $option[OssClient::OSS_KEY_MARKER] = $result->getNextKeyMarker();
            $option[OssClient::OSS_VERSION_ID_MARKER] = $result->getNextVersionIdMarker();
        }else{
            $bool = false;
        }
    }
} catch(OssException $e) {
    printf($e->getMessage() . "\n");
    return;
}

列举指定个数的Object版本信息

以下代码用于列举examplebucket中指定个数的Object版本信息。

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "yourEndpoint";
// 填写Bucket名称,例如examplebucket。
$bucket= "examplebucket";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);

try{
    $option = array(
        OssClient::OSS_KEY_MARKER => null,
        OssClient::OSS_VERSION_ID_MARKER => null,
        OssClient::OSS_MAX_KEYS => 200   // 指定最多列举200个Object版本信息。
    );
    $result = $ossClient->listObjectVersions($bucket,$option);
    // 查看Object的版本信息。
    foreach ($result->getObjectVersionList() as $key => $info){
        printf("key name: ".$info->getKey().PHP_EOL);
        printf("versionid: ".$info->getVersionId().PHP_EOL);
        printf("Is latest: ".$info->getIsLatest().PHP_EOL.PHP_EOL);
    }

    // 查看删除标记的版本信息。
    foreach ($result->getDeleteMarkerList() as $key => $info){
        printf("del_maker key name: ".$info->getKey().PHP_EOL);
        printf("del_maker versionid: ".$info->getVersionId().PHP_EOL);
        printf("del_maker Is latest: ".$info->getIsLatest().PHP_EOL.PHP_EOL);
    }
} catch(OssException $e) {
    printf($e->getMessage() . "\n");
    return;
}

文件夹功能

OSS没有文件夹的概念,所有元素都是以文件来存储。创建文件夹本质上来说是创建了一个大小为0并以正斜线(/)结尾的文件。这个文件可以被上传和下载,控制台会对以正斜线(/)结尾的文件以文件夹的方式展示。

通过delimiter和prefix两个参数可以模拟文件夹功能:

  • 如果设置prefix为某个文件夹名称,则会列举以此prefix开头的文件,即该文件夹下所有的文件和子文件夹(目录)均显示为Object。
  • 如果在设置了prefix的情况下,将delimiter设置为正斜线(/),则只列举该文件夹下的文件和子文件夹(目录),该文件夹下的子文件夹(目录)显示为CommonPrefixes,子文件夹下的文件和文件夹不显示。
  • 列举根目录下Object的版本信息

    以下代码用于列举examplebucket中根目录下Object的版本信息。

    <?php
    if (is_file(__DIR__ . '/../autoload.php')) {
        require_once __DIR__ . '/../autoload.php';
    }
    if (is_file(__DIR__ . '/../vendor/autoload.php')) {
        require_once __DIR__ . '/../vendor/autoload.php';
    }
    
    use OSS\OssClient;
    use OSS\Core\OssException;
    
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    $accessKeyId = "yourAccessKeyId";
    $accessKeySecret = "yourAccessKeySecret";
    // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    $endpoint = "yourEndpoint";
    // 填写Bucket名称,例如examplebucket。
    $bucket= "examplebucket";
    
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
    
    try{
        $option = array(
            OssClient::OSS_KEY_MARKER => null,
            OssClient::OSS_VERSION_ID_MARKER => null,
            OssClient::OSS_DELIMITER => "/",    // 指定分隔符为正斜线(/)。
        );
        $bool = true;
        while ($bool){
            $result = $ossClient->listObjectVersions($bucket,$option);
            // 查看Object的版本信息。
            foreach ($result->getObjectVersionList() as $key => $info){
                printf("key name: {$info->getKey()}\n");
                printf("versionid: {$info->getVersionId()}\n");
                printf("Is latest: {$info->getIsLatest()}\n\n");
            }
    
            // 查看删除标记的版本信息。
            foreach ($result->getDeleteMarkerList() as $key => $info){
                printf("del_maker key name: {$info->getKey()}\n");
                printf("del_maker versionid: {$info->getVersionId()}\n");
                printf("del_maker Is latest: {$info->getIsLatest()}\n\n");
            }
    
            if($result->getIsTruncated() === 'true'){
                $option[OssClient::OSS_KEY_MARKER] = $result->getNextKeyMarker();
                $option[OssClient::OSS_VERSION_ID_MARKER] = $result->getNextVersionIdMarker();
            }else{
                $bool = false;
            }
        }
    } catch(OssException $e) {
        printf($e->getMessage() . "\n");
        return;
    }                   
  • 列举指定目录下Object的版本信息

    以下代码用于列举examplebucket中test目录下Object的版本信息。

    <?php
    if (is_file(__DIR__ . '/../autoload.php')) {
        require_once __DIR__ . '/../autoload.php';
    }
    if (is_file(__DIR__ . '/../vendor/autoload.php')) {
        require_once __DIR__ . '/../vendor/autoload.php';
    }
    
    use OSS\OssClient;
    use OSS\Core\OssException;
    
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    $accessKeyId = "yourAccessKeyId";
    $accessKeySecret = "yourAccessKeySecret";
    // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    $endpoint = "yourEndpoint";
    // 填写Bucket名称,例如examplebucket。
    $bucket= "examplebucket";
    
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false);
    
    try{
        $option = array(
            OssClient::OSS_KEY_MARKER => null,
            OssClient::OSS_VERSION_ID_MARKER => null,
            OssClient::OSS_DELIMITER => "/",    // 指定分隔符为正斜线(/)。
            OssClient::OSS_PREFIX => "test/",   // 指定列举test目录下Object的版本信息。
        );
        $bool = true;
        while ($bool){
            $result = $ossClient->listObjectVersions($bucket,$option);
            // 查看Object的版本信息。
            foreach ($result->getObjectVersionList() as $key => $info){
                printf("key name: {$info->getKey()}\n");
                printf("versionid: {$info->getVersionId()}\n");
                printf("Is latest: {$info->getIsLatest()}\n\n");
            }
    
            // 查看删除标记的版本信息。
            foreach ($result->getDeleteMarkerList() as $key => $info){
                printf("del_maker key name: {$info->getKey()}\n");
                printf("del_maker versionid: {$info->getVersionId()}\n");
                printf("del_maker Is latest: {$info->getIsLatest()}\n\n");
            }
    
            if($result->getIsTruncated() === 'true'){
                $option[OssClient::OSS_KEY_MARKER] = $result->getNextKeyMarker();
                $option[OssClient::OSS_VERSION_ID_MARKER] = $result->getNextVersionIdMarker();
            }else{
                $bool = false;
            }
        }
    } catch(OssException $e) {
        printf($e->getMessage() . "\n");
        return;
    }