开发者社区> 问答> 正文

PHP-SDK之如何实现管理文件(一)?

在OSS中,用户可以通过一系列的接口管理存储空间(Bucket)中的文件(Object),比如ListObjects,DeleteObject,CopyObject,DoesObjectExist等。


提示:
  • 以下场景的完整代码路径:GitHub


列出存储空间中的文件


您可以使用OssClient::listObjects列出存储中间中的文件: <?php
/**
* 列出Bucket内所有目录和文件, 根据返回的nextMarker循环调用listObjects接口得到所有文件和目录
*
* @param OssClient $ossClient OssClient实例
* @param string $bucket 存储空间名称
* @return null
*/
function listAllObjects($ossClient, $bucket)
{
    //构造dir下的文件和虚拟目录
    for ($i = 0; $i < 100; $i += 1) {
        $ossClient->putObject($bucket, "dir/obj" . strval($i), "hi");
        $ossClient->createObjectDir($bucket, "dir/obj" . strval($i));
    }
    $prefix = 'dir/';
    $delimiter = '/';
    $nextMarker = '';
    $maxkeys = 30;
    while (true) {
        $options = array(
            'delimiter' => $delimiter,
            'prefix' => $prefix,
            'max-keys' => $maxkeys,
            'marker' => $nextMarker,
        );
        var_dump($options);
        try {
            $listObjectInfo = $ossClient->listObjects($bucket, $options);
        } catch (OssException $e) {
            printf(__FUNCTION__ . ": FAILED\n");
            printf($e->getMessage() . "\n");
            return;
        }
        // 得到nextMarker,从上一次listObjects读到的最后一个文件的下一个文件开始继续获取文件列表
        $nextMarker = $listObjectInfo->getNextMarker();
        $listObject = $listObjectInfo->getObjectList();
        $listPrefix = $listObjectInfo->getPrefixList();
        var_dump(count($listObject));
        var_dump(count($listPrefix));
        if ($nextMarker === '') {
            break;
        }
    }
}


上述例子中提到的$options参数说明:
key说明
delimiter用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素——CommonPrefixes
prefix限定返回的object key必须以prefix作为前缀。注意使用prefix查询时,返回的key中仍会包含prefix
max-keys限定此次返回object的最大数,如果不设定,默认为100,max-keys取值不能大于1000
marker设定结果从marker之后按字母排序的第一个开始返回

提示:
  • prefix/delimiter/marker/max-keys都是可选参数。


判断文件是否存在


您可以使用OssClient::doesObjectExist判断文件是否存在: [/code]


创建虚拟目录


OSS是没有文件夹这个概念的,所有元素都是以Object来存储。创建文件夹本质上来说是创建了一个size为0的Object。对于这个Object可以上传下载,只是控制台会对以”/“结尾的Object以文件夹的方式展示。[code]<?php
/**
* 创建虚拟目录
*
* @param OssClient $ossClient OSSClient实例
* @param string $bucket 存储空间名称
* @return null
*/
function createObjectDir($ossClient, $bucket) {
    try{
        $ossClient->createObjectDir($bucket, "dir");
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}



删除单个文件


您可以使用OssClient::deleteObject删除单个文件: <?php
/**
* 删除object
*
* @param OssClient $ossClient OSSClient实例
* @param string $bucket bucket名字
* @return null
*/
function deleteObject($ossClient, $bucket)
{
    $object = "oss-php-sdk-test/upload-test-object-name.txt";
    try{
        $ossClient->deleteObject($bucket, $object);
    } catch(OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print(__FUNCTION__ . ": OK" . "\n");
}


注意:
  • 文件删除后将无法恢复。






展开
收起
青衫无名 2017-10-19 10:02:51 1769 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载