更新时间:2024-04-30 GMT+08:00
分享

复制对象

开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。

复制对象特性用来为OBS上已经存在的对象创建一个副本。

您可以通过ObsClient->copyObject来复制对象。复制对象时,可重新指定新对象的属性和设置对象权限,且支持条件复制。

  • 如果待复制的源对象是归档存储类型,则必须先恢复源对象才能进行复制。

简单复制

以下代码展示了如何进行简单复制:

// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
// 创建ObsClient实例
$obsClient = new ObsClient ( [ 
      //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
      'key' => getenv('ACCESS_KEY_ID'),
      'secret' => getenv('SECRET_ACCESS_KEY'),
      'endpoint' => 'https://your-endpoint',
      'signature' => 'obs'
] );

$resp = $obsClient->copyObject ( [ 
      'Bucket' => 'destbucketname',
      'Key' => 'destobjectname',
      'CopySource' => 'sourcebucketname/sourceobjectname'
] );
printf ( "RequestId:%s\n", $resp ['RequestId'] );

使用CopySource参数指定复制时的源对象信息。

重写对象属性

以下代码展示了如何在复制对象时重写对象属性:

// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
// 创建ObsClient实例
$obsClient = new ObsClient ( [ 
      //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
      'key' => getenv('ACCESS_KEY_ID'),
      'secret' => getenv('SECRET_ACCESS_KEY'),
      'endpoint' => 'https://your-endpoint',
      'signature' => 'obs'
] );

$resp = $obsClient->copyObject ( [ 
       'Bucket' => 'destobjectname',
       'Key' => 'destobjectname',
       'CopySource' => 'sourcebucketname/soureobjectname',
       'ContentType' => 'image/jpeg',
       'StorageClass' => ObsClient::StorageClassWarm,
       'Metadata' => ['property' => 'property-value'],
       'MetadataDirective' => ObsClient::ReplaceMetadata
] );
printf ( "RequestId:%s\n", $resp ['RequestId'] );

使用Metadata参数指定待重写的自定义对象属性;使用MetadataDirective参数指定重写选项,支持ObsClient::ReplaceMetadata(重写)和ObsClient::CopyMetadata(从源对象复制)两个值。

限定条件复制

复制对象时,可以指定一个或多个限定条件,满足限定条件时则进行复制,否则抛出异常,复制对象失败。

您可以使用的限定条件如下:

参数

作用

格式

CopySourceIfModifiedSince

如果源对象在指定的时间后有修改,则进行复制,否则抛出异常。

符合http://www.ietf.org/rfc/rfc2616.txt规定格式的HTTP时间字符串。

CopySourceIfUnmodifiedSince

如果源对象在指定的时间后没有修改,则进行复制,否则抛出异常。

符合http://www.ietf.org/rfc/rfc2616.txt规定格式的HTTP时间字符串。

CopySourceIfMatch

如果源对象的ETag值与该参数值相同,则进行复制,否则抛出异常。

字符串。

CopySourceIfNoneMatch

如果源对象的ETag值与该参数值不相同,则进行复制,否则抛出异常。

字符串。

  • 源对象的ETag值是指源对象数据的MD5校验值。
  • 如果包含CopySourceIfUnmodifiedSince并且不符合,或者包含CopySourceIfMatch并且不符合,或者包含CopySourceIfModifiedSince并且不符合,或者包含CopySourceIfNoneMatch并且不符合,则复制失败,抛出异常中HTTP状态码为:412 precondition failed。
  • CopySourceIfModifiedSince和CopySourceIfNoneMatch可以一起使用;CopySourceIfUnmodifiedSince和CopySourceIfMatch可以一起使用。

以下代码展示了如何进行限定条件复制:

// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
// 创建ObsClient实例
$obsClient = new ObsClient ( [ 
      //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
      'key' => getenv('ACCESS_KEY_ID'),
      'secret' => getenv('SECRET_ACCESS_KEY'),
      'endpoint' => 'https://your-endpoint',
      'signature' => 'obs'
] );

$resp = $obsClient->copyObject ( [ 
       'Bucket' => 'destobjectname',
       'Key' => 'destobjectname',
       'CopySource' => 'sourcebucketname/soureobjectname',
       'CopySourceIfModifiedSince' => 'Thu, 31 Dec 2015 16:00:00 GMT',    
       'CopySourceIfNoneMatch' => 'none-match-etag'
] );
printf ( "RequestId:%s\n", $resp ['RequestId'] );

重写对象访问权限

以下代码展示了如何在复制对象时重写对象访问权限:

// 引入依赖库
require 'vendor/autoload.php';
// 使用源码安装时引入SDK代码库
// require 'obs-autoloader.php';
// 声明命名空间
use Obs\ObsClient;
// 创建ObsClient实例
$obsClient = new ObsClient ( [ 
      //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
      'key' => getenv('ACCESS_KEY_ID'),
      'secret' => getenv('SECRET_ACCESS_KEY'),
      'endpoint' => 'https://your-endpoint',
      'signature' => 'obs'
] );

$resp = $obsClient->copyObject ( [ 
       'Bucket' => 'destobjectname',
       'Key' => 'destobjectname',
       'CopySource' => 'sourcebucketname/soureobjectname',
       // 复制时重写对象访问权限为公共读    
       'ACL' => ObsClient::AclPublicRead
] );
printf ( "RequestId:%s\n", $resp ['RequestId'] );

使用ACL参数重写对象访问权限。

相关文档