PHP SDK 手册

文件管理

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

列出桶中的文件

您可以使用 NosClient::listObjects 列出指定桶中的文件,可以根据指定的前缀列出文件:

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

上述代码中的$options 中的参数如下所示:

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

Note

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

判断文件是否存在

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

<?php
/**
* 判断 object 是否存在
*
* @param NosClient $nosClient NosClient 实例
* @param string $bucket bucket 名字
* @return null
*/
function doesObjectExist($nosClient, $bucket)
{
  $object = "nos-php-sdk-test/upload-test-object-name.txt";
  try{
    $exist = $nosClient->doesObjectExist($bucket, $object);
  } catch(NosException $e) {
  printf(__FUNCTION__ . ": FAILED\n");
  printf($e->getMessage() . "\n");
  return;
  }
  print(__FUNCTION__ . ": OK" . "\n");
  var_dump($exist);
}

删除单个文件

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

<?php
/**
* 删除 object
*
* @param NosClient $nosClient NosClient 实例
* @param string $bucket bucket 名字
* @return null
*/
function deleteObject($nosClient, $bucket)
{
  $object = "nos-php-sdk-test/upload-test-object-name.txt";
  try{
    $nosClient->deleteObject($bucket, $object);
  } catch(NosException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
  }
  print(__FUNCTION__ . ": OK" . "\n");
}

删除多个文件

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

<?php
/**
* 批量删除 object
*
* @param NosClient $nosClient NosClient 实例
* @param string $bucket bucket 名字
* @return null
*/
function deleteObjects($nosClient, $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{
    $nosClient->deleteObjects($bucket, $objects);
  } catch(NosException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
  }
  print(__FUNCTION__ . ": OK" . "\n");
}

拷贝文件

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

<?php
/**
* 拷贝 object
*
* @param NosClient $nosClient NosClient 实例
* @param string $bucket bucket 名字
* @return null
*/
function copyObject($nosClient, $bucket)
{
  $from_bucket = $bucket;
  $from_object = "nos-php-sdk-test/upload-test-object-name.txt";
  $to_bucket = $bucket;
  $to_object = $from_object . '.copy';
  try{
    $nosClient->copyObject($from_bucket, $from_object, $to_bucket, $to_object);
  } catch(NosException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
  }
  print(__FUNCTION__ . ": OK" . "\n");
}

Attention

支持跨桶的文件 copy

移动文件

您可以使用 NosClient::moveObject 移动文件:

<?php
/**
* 移动 Object
*
* @param NosClient $nosClient NosClient 实例
* @param string $bucket bucket 名字
* @return null
*/
function copyObject($nosClient, $bucket)
{
  $from_bucket = $bucket;
  $from_object = "nos-php-sdk-test/upload-test-object-name.txt";
  $to_bucket = $bucket;
  $to_object = $from_object . '.move';
  try{
    $nosClient->moveObject($from_bucket, $from_object, $to_bucket, $to_object);
  } catch(NosException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
  }
  print(__FUNCTION__ . ": OK" . "\n");
}

Attention

暂时不支持跨桶的文件 move

修改文件元信息

暂时不提供此类方法

获取文件的文件元信息

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

<?php
/**
* 获取 object meta, 也就是 getObjectMeta 接口
*
* @param NosClient $nosClient NosClient 实例
* @param string $bucket 存储空间名称
* @return null
*/
function getObjectMeta($nosClient, $bucket)
{
  $object = "nos-php-sdk-test/upload-test-object-name.txt";
  try {
    $objectMeta = $nosClient->getObjectMeta($bucket, $object);
  } catch (NosException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
  }
  print(__FUNCTION__ . ": OK" . "\n");
  if (isset($objectMeta[strtolower('Content-Disposition')]) &&
    'attachment; filename="xxxxxx"' === $objectMeta[strtolower('Content-Disposition')]
  ) {
    print(__FUNCTION__ . ": ObjectMeta checked OK" . "\n");
  } else {
    print(__FUNCTION__ . ": ObjectMeta checked FAILED" . "\n");
  }
}

Attention:

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

授权访问

通过生成签名 URL 的形式提供给用户一个临时的访问 URL。在生成 URL 时,您可以指定 URL 过期的时间,从而限制用户长时间访问。

生成私有下载链接 生成 GetObject 的签名 url 示例如下:

<?php
/**
* 生成 GetObject 的签名 url,主要用于私有权限下的读访问控制
*
* @param $nosClient NosClient NosClient 实例
* @param $bucket string bucket 名称
* @return null
*/
function getSignedUrlForGettingObject($nosClient, $bucket)
{
  $object = "test/test-signature-test-upload-and-download.txt";
  $timeout = 3600; // URL 的有效期是 3600 秒
  try{
    $signedUrl = $nosClient->signUrl($bucket, $object, $timeout);
  } catch(NosException $e) {
    printf(__FUNCTION__ . ": FAILED\n");
    printf($e->getMessage() . "\n");
    return;
  }
  print(__FUNCTION__ . ": signedUrl: " . $signedUrl. "\n");
  /**
  * 可以类似的代码来访问签名的 URL,也可以输入到浏览器中去访问
  */
  $request = new RequestCore($signedUrl);
  $request->set_method('GET');
  $request->add_header("Content-Type", "");
  $request->send_request();
  $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request-    >get_response_code());
  if ($res->isOK()) {
    print(__FUNCTION__ . ": OK" . "\n");
  } else {
    print(__FUNCTION__ . ": FAILED" . "\n");
  };
}

Attention

1.参数 timeout 不传时 URL 的默认有效期是 60s,用户可以指定 URL 过期的时间

2.URL 过期后,需要重新生成