复制对象
复制对象特性用来为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/intl/zh-cn/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/intl/zh-cn/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/intl/zh-cn/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/intl/zh-cn/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参数重写对象访问权限。