全部产品
对象存储 OSS

管理文件

更新时间:2017-06-07 13:26:11   分享:   

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

提示:

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

列出存储空间中的文件

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

  1. <?php
  2. /**
  3. * 列出Bucket内所有目录和文件, 根据返回的nextMarker循环调用listObjects接口得到所有文件和目录
  4. *
  5. * @param OssClient $ossClient OssClient实例
  6. * @param string $bucket 存储空间名称
  7. * @return null
  8. */
  9. function listAllObjects($ossClient, $bucket)
  10. {
  11. //构造dir下的文件和虚拟目录
  12. for ($i = 0; $i < 100; $i += 1) {
  13. $ossClient->putObject($bucket, "dir/obj" . strval($i), "hi");
  14. $ossClient->createObjectDir($bucket, "dir/obj" . strval($i));
  15. }
  16. $prefix = 'dir/';
  17. $delimiter = '/';
  18. $nextMarker = '';
  19. $maxkeys = 30;
  20. while (true) {
  21. $options = array(
  22. 'delimiter' => $delimiter,
  23. 'prefix' => $prefix,
  24. 'max-keys' => $maxkeys,
  25. 'marker' => $nextMarker,
  26. );
  27. var_dump($options);
  28. try {
  29. $listObjectInfo = $ossClient->listObjects($bucket, $options);
  30. } catch (OssException $e) {
  31. printf(__FUNCTION__ . ": FAILED\n");
  32. printf($e->getMessage() . "\n");
  33. return;
  34. }
  35. // 得到nextMarker,从上一次listObjects读到的最后一个文件的下一个文件开始继续获取文件列表
  36. $nextMarker = $listObjectInfo->getNextMarker();
  37. $listObject = $listObjectInfo->getObjectList();
  38. $listPrefix = $listObjectInfo->getPrefixList();
  39. var_dump(count($listObject));
  40. var_dump(count($listPrefix));
  41. if ($nextMarker === '') {
  42. break;
  43. }
  44. }
  45. }

上述例子中提到的$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判断文件是否存在:

  1. <?php
  2. /**
  3. * 判断object是否存在
  4. *
  5. * @param OssClient $ossClient OSSClient实例
  6. * @param string $bucket bucket名字
  7. * @return null
  8. */
  9. function doesObjectExist($ossClient, $bucket)
  10. {
  11. $object = "oss-php-sdk-test/upload-test-object-name.txt";
  12. try{
  13. $exist = $ossClient->doesObjectExist($bucket, $object);
  14. } catch(OssException $e) {
  15. printf(__FUNCTION__ . ": FAILED\n");
  16. printf($e->getMessage() . "\n");
  17. return;
  18. }
  19. print(__FUNCTION__ . ": OK" . "\n");
  20. var_dump($exist);
  21. }

创建虚拟目录

OSS是没有文件夹这个概念的,所有元素都是以Object来存储。创建文件夹本质上来说是创建了一个size为0的Object。对于这个Object可以上传下载,只是控制台会对以”/“结尾的Object以文件夹的方式展示。

  1. <?php
  2. /**
  3. * 创建虚拟目录
  4. *
  5. * @param OssClient $ossClient OSSClient实例
  6. * @param string $bucket 存储空间名称
  7. * @return null
  8. */
  9. function createObjectDir($ossClient, $bucket) {
  10. try{
  11. $ossClient->createObjectDir($bucket, "dir");
  12. } catch(OssException $e) {
  13. printf(__FUNCTION__ . ": FAILED\n");
  14. printf($e->getMessage() . "\n");
  15. return;
  16. }
  17. print(__FUNCTION__ . ": OK" . "\n");
  18. }

删除单个文件

您可以使用OssClient::deleteObject删除单个文件:

  1. <?php
  2. /**
  3. * 删除object
  4. *
  5. * @param OssClient $ossClient OSSClient实例
  6. * @param string $bucket bucket名字
  7. * @return null
  8. */
  9. function deleteObject($ossClient, $bucket)
  10. {
  11. $object = "oss-php-sdk-test/upload-test-object-name.txt";
  12. try{
  13. $ossClient->deleteObject($bucket, $object);
  14. } catch(OssException $e) {
  15. printf(__FUNCTION__ . ": FAILED\n");
  16. printf($e->getMessage() . "\n");
  17. return;
  18. }
  19. print(__FUNCTION__ . ": OK" . "\n");
  20. }

注意:

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

删除多个文件

您可以使用OssClient::deleteObjects批量删除多个文件:

  1. <?php
  2. /**
  3. * 批量删除object
  4. *
  5. * @param OssClient $ossClient OSSClient实例
  6. * @param string $bucket bucket名字
  7. * @return null
  8. */
  9. function deleteObjects($ossClient, $bucket)
  10. {
  11. $objects = array();
  12. $objects[] = "oss-php-sdk-test/upload-test-object-name.txt";
  13. $objects[] = "oss-php-sdk-test/upload-test-object-name.txt.copy";
  14. try{
  15. $ossClient->deleteObjects($bucket, $objects);
  16. } catch(OssException $e) {
  17. printf(__FUNCTION__ . ": FAILED\n");
  18. printf($e->getMessage() . "\n");
  19. return;
  20. }
  21. print(__FUNCTION__ . ": OK" . "\n");
  22. }

拷贝文件

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

  1. <?php
  2. /**
  3. * 拷贝object
  4. *
  5. * @param OssClient $ossClient OSSClient实例
  6. * @param string $bucket bucket名字
  7. * @return null
  8. */
  9. function copyObject($ossClient, $bucket)
  10. {
  11. $from_bucket = $bucket;
  12. $from_object = "oss-php-sdk-test/upload-test-object-name.txt";
  13. $to_bucket = $bucket;
  14. $to_object = $from_object . '.copy';
  15. try{
  16. $ossClient->copyObject($from_bucket, $from_object, $to_bucket, $to_object);
  17. } catch(OssException $e) {
  18. printf(__FUNCTION__ . ": FAILED\n");
  19. printf($e->getMessage() . "\n");
  20. return;
  21. }
  22. print(__FUNCTION__ . ": OK" . "\n");
  23. }

注意:

  • OssClient::copyObject可以拷贝小于1GB的文件。拷贝一个大于1GB的文件时,请使用OssClient::uploadPartCopy

修改文件元信息(Object Meta)

文件元信息(Object Meta),是对用户上传到OSS的文件的属性描述,分为两种:HTTP标准属性(HTTP Headers)和User Meta(用户自定义元信息)。文件元信息可以在各种方式上传或者拷贝文件时进行设置。

HTTP标准属性,Cache-Control、Content-Disposition、Content-Encoding、Content-Language、Expires、Content-Length、Content-Type、Last-Modified等。

为了便于用户对Object进行更多描述。OSS中规定所有以x-oss-meta-为前缀的参数,则视为User Meta比如x-oss-meta-location。一个Object可以有多个类似的参数,但所有的User Meta总大小不能超过8k。这些User Meta信息会在下载文件/获取文件元数据时返回。

更多文件元信息的介绍,请参看 文件元信息

可以通过拷贝操作来实现修改已有文件元信息。如果拷贝操作的源文件地址和目标文件地址相同,都会直接替换源文件的文件元信息。

  1. /**
  2. * 修改文件元信息
  3. * 利用copyObject接口的特性:当目的object和源object完全相同时,表示修改object的文件元信息
  4. *
  5. * @param OssClient $ossClient OSSClient实例
  6. * @param string $bucket 存储空间名称
  7. * @return null
  8. */
  9. function modifyMetaForObject($ossClient, $bucket)
  10. {
  11. $fromBucket = $bucket;
  12. $fromObject = "oss-php-sdk-test/upload-test-object-name.txt";
  13. $toBucket = $bucket;
  14. $toObject = $fromObject;
  15. $copyOptions = array(
  16. OssClient::OSS_HEADERS => array(
  17. 'Expires' => '2018-10-01 08:00:00',
  18. 'Content-Disposition' => 'attachment; filename="xxxxxx"',
  19. 'x-oss-meta-location' => 'location',
  20. ),
  21. );
  22. try{
  23. $ossClient->copyObject($fromBucket, $fromObject, $toBucket, $toObject, $copyOptions);
  24. } catch(OssException $e) {
  25. printf(__FUNCTION__ . ": FAILED\n");
  26. printf($e->getMessage() . "\n");
  27. return;
  28. }
  29. print(__FUNCTION__ . ": OK" . "\n");
  30. }

提示:

  • 通过修改文件的Content-Type,可以修改文件的类型。
  • 通过修改文件的Content-Disposition,可以控制文件的下载行为。

获取文件的文件元信息(Object Meta)

您可以使用OssClient::getObjectMeta获取文件的文件元信息:

  1. <?php
  2. /**
  3. * 获取object meta, 也就是getObjectMeta接口
  4. *
  5. * @param OssClient $ossClient OssClient实例
  6. * @param string $bucket 存储空间名称
  7. * @return null
  8. */
  9. function getObjectMeta($ossClient, $bucket)
  10. {
  11. $object = "oss-php-sdk-test/upload-test-object-name.txt";
  12. try {
  13. $objectMeta = $ossClient->getObjectMeta($bucket, $object);
  14. } catch (OssException $e) {
  15. printf(__FUNCTION__ . ": FAILED\n");
  16. printf($e->getMessage() . "\n");
  17. return;
  18. }
  19. print(__FUNCTION__ . ": OK" . "\n");
  20. if (isset($objectMeta[strtolower('Content-Disposition')]) &&
  21. 'attachment; filename="xxxxxx"' === $objectMeta[strtolower('Content-Disposition')]
  22. ) {
  23. print(__FUNCTION__ . ": ObjectMeta checked OK" . "\n");
  24. } else {
  25. print(__FUNCTION__ . ": ObjectMeta checked FAILED" . "\n");
  26. }
  27. }

设置文件访问权限

Object有四种访问权限:default(默认),private(私有读写), public-read(公共读私有写), public-read-write(公共读写),含义如下:

权限 描述 PHP SDK对应值
默认 Objec是遵循Bucket的读写权限,即Bucket是什么权限,Object就是什么权限,Object的默认权限 default
私有读写 Object是私有资源,即只有该Object的Owner拥有该Object的读写权限,其他的用户没有权限操作该Object private
公共读私有写 Object是公共读资源,即非Object Owner只有Object的读权限,而Object Owner拥有该Object的读写权限 public-read
公共读写 Object是公共读写资源,即所有用户拥有对该Object的读写权限 public-read-write

Object的权限优先级高于Bucket。例如Bucket是private的,而Object ACL是公共读写,则访问这个Object时,先判断Object的ACL,所有用户都拥有这个Object的访问权限,即使这个Bucket是private。如果某个Object从来没设置过ACL,则访问权限遵循Bucket ACL。

您可以使用OssClient::putObjectAcl设置文件的访问权限:

  1. <?php
  2. /**
  3. * 获取文件范围权限
  4. *
  5. * @param OssClient $ossClient OssClient实例
  6. * @param string $bucket 存储空间名称
  7. * @return null
  8. */
  9. function putObjectAcl($ossClient, $bucket)
  10. {
  11. $object = "oss-php-sdk-test/upload-test-object-name.txt";
  12. $acl = "public-read";
  13. try {
  14. $ossClient->putObjectAcl($bucket, $object, $acl);
  15. } catch (OssException $e) {
  16. printf(__FUNCTION__ . ": FAILED\n");
  17. printf($e->getMessage() . "\n");
  18. return;
  19. }
  20. print(__FUNCTION__ . ": OK" . "\n");
  21. }

获取文件访问权限

您可以使用OssClient::getObjectAcl获取文件的访问权限:

  1. <?php
  2. /**
  3. * 获取object的访问权限
  4. *
  5. * @param OssClient $ossClient OssClient实例
  6. * @param string $bucket 存储空间名称
  7. * @return null
  8. */
  9. function getObjectMeta($ossClient, $bucket)
  10. {
  11. $object = "oss-php-sdk-test/upload-test-object-name.txt";
  12. try {
  13. $objectAcl = $ossClient->getObjectAcl($bucket, $object);
  14. } catch (OssException $e) {
  15. printf(__FUNCTION__ . ": FAILED\n");
  16. printf($e->getMessage() . "\n");
  17. return;
  18. }
  19. print(__FUNCTION__ . ": OK" . "\n");
  20. var_dump($objectAcl);
  21. }
本文导读目录
本文导读目录
以上内容是否对您有帮助?