diff --git a/src/OSS/Core/OssUtil.php b/src/OSS/Core/OssUtil.php index b70680ee..6e5d4133 100644 --- a/src/OSS/Core/OssUtil.php +++ b/src/OSS/Core/OssUtil.php @@ -170,6 +170,19 @@ public static function startsWith($str, $findMe) } } + /** + * 生成createBucketXmlBody接口的xml消息 + * + * @param string $storageClass + * @return string + */ + public static function createBucketXmlBody($storageClass) + { + $xml = new \SimpleXMLElement(''); + $xml->addChild('StorageClass', $storageClass); + return $xml->asXML(); + } + /** * 检验$options * diff --git a/src/OSS/OssClient.php b/src/OSS/OssClient.php index 34cfb0bd..9d9605ac 100644 --- a/src/OSS/OssClient.php +++ b/src/OSS/OssClient.php @@ -131,15 +131,17 @@ public function listBuckets($options = NULL) * @param string $bucket * @param string $acl * @param array $options + * @param string $storageType * @return null */ - public function createBucket($bucket, $acl = self::OSS_ACL_TYPE_PRIVATE, $options = NULL) + public function createBucket($bucket, $acl = self::OSS_ACL_TYPE_PRIVATE, $options = NULL, $storageType = self::OSS_STORAGE_TYPE_STANDARD) { $this->precheckCommon($bucket, NULL, $options, false); $options[self::OSS_BUCKET] = $bucket; $options[self::OSS_METHOD] = self::OSS_HTTP_PUT; $options[self::OSS_OBJECT] = '/'; $options[self::OSS_HEADERS] = array(self::OSS_ACL => $acl); + $options[self::OSS_CONTENT] = OssUtil::createBucketXmlBody($storageType); $response = $this->auth($options); $result = new PutSetDeleteResult($response); return $result->getData(); @@ -1412,6 +1414,27 @@ public function doesObjectExist($bucket, $object, $options = NULL) return $result->getData(); } + /** + * 针对Archive类型的Object读取 + * 需要使用Restore操作让服务端执行解冻任务 + * + * @param string $bucket bucket名称 + * @param string $object object名称 + * @return null + * @throws OssException + */ + public function restoreObject($bucket, $object, $options = NULL) + { + $this->precheckCommon($bucket, $object, $options); + $options[self::OSS_BUCKET] = $bucket; + $options[self::OSS_METHOD] = self::OSS_HTTP_POST; + $options[self::OSS_OBJECT] = $object; + $options[self::OSS_SUB_RESOURCE] = self::OSS_RESTORE; + $response = $this->auth($options); + $result = new PutSetDeleteResult($response); + return $result->getData(); + } + /** * 获取分片大小,根据用户提供的part_size,重新计算一个更合理的partsize * @@ -2349,6 +2372,7 @@ private function generateSignableQueryStringParam($options) self::OSS_PROCESS, self::OSS_POSITION, self::OSS_SYMLINK, + self::OSS_RESTORE, ); foreach ($signableList as $item) { @@ -2613,6 +2637,10 @@ public function setConnectTimeout($connectTimeout) const OSS_HTTP_CODE = 'http_code'; const OSS_REQUEST_ID = 'x-oss-request-id'; const OSS_INFO = 'info'; + const OSS_RESTORE = 'restore'; + const OSS_STORAGE_TYPE_STANDARD = 'Standard'; + const OSS_STORAGE_TYPE_IA = 'IA'; + const OSS_STORAGE_TYPE_ARCHIVE = 'Archive'; //私有URL变量 const OSS_URL_ACCESS_KEY_ID = 'OSSAccessKeyId'; diff --git a/tests/OSS/Tests/OssClientBucketTest.php b/tests/OSS/Tests/OssClientBucketTest.php index 57d4459f..bb1f053b 100644 --- a/tests/OSS/Tests/OssClientBucketTest.php +++ b/tests/OSS/Tests/OssClientBucketTest.php @@ -10,6 +10,9 @@ class OssClientBucketTest extends TestOssClientBase { + private $IABucket; + private $ArchiveBucket; + public function testBucketWithInvalidName() { try { @@ -54,4 +57,45 @@ public function testBucket() $this->assertEquals('200', $res['info']['http_code']); $this->assertEquals('oss-us-west-1', $res['x-oss-bucket-region']); } + + public function testCreateBucketWithStorageType() + { + $object = 'storage-object'; + + $this->ossClient->putObject($this->ArchiveBucket, $object,'testcontent'); + try{ + $this->ossClient->getObject($this->ArchiveBucket, $object); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('403', $e->getHTTPStatus()); + $this->assertEquals('InvalidObjectState', $e->getErrorCode()); + } + + $this->ossClient->putObject($this->IABucket, $object,'testcontent'); + $result = $this->ossClient->getObject($this->IABucket, $object); + $this->assertEquals($result, 'testcontent'); + + $this->ossClient->putObject($this->bucket, $object,'testcontent'); + $result = $this->ossClient->getObject($this->bucket, $object); + $this->assertEquals($result, 'testcontent'); + } + + public function setUp() + { + parent::setUp(); // TODO: Change the autogenerated stub + $this->IABucket = 'ia-'.$this->bucket; + $this->ArchiveBucket = 'archive-'.$this->bucket; + $this->ossClient->createBucket($this->IABucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_IA); + $this->ossClient->createBucket($this->ArchiveBucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_ARCHIVE); + } + + public function tearDown() + { + $object = 'storage-object'; + parent::tearDown(); // TODO: Change the autogenerated stub + $this->ossClient->deleteObject($this->IABucket, $object); + $this->ossClient->deleteObject($this->ArchiveBucket, $object); + $this->ossClient->deleteBucket($this->IABucket); + $this->ossClient->deleteBucket($this->ArchiveBucket); + } } diff --git a/tests/OSS/Tests/OssClientRestoreObjectTest.php b/tests/OSS/Tests/OssClientRestoreObjectTest.php new file mode 100644 index 00000000..ad830b20 --- /dev/null +++ b/tests/OSS/Tests/OssClientRestoreObjectTest.php @@ -0,0 +1,87 @@ +ossClient->putObject($this->IABucket, $object,'testcontent'); + try{ + $this->ossClient->restoreObject($this->IABucket, $object); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('400', $e->getHTTPStatus()); + $this->assertEquals('OperationNotSupported', $e->getErrorCode()); + } + } + + public function testNullObjectRestoreObject() + { + $object = 'null-object'; + + try{ + $this->ossClient->restoreObject($this->bucket, $object); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('404', $e->getHTTPStatus()); + } + } + + public function testArchiveRestoreObject() + { + $object = 'storage-object'; + + $this->ossClient->putObject($this->ArchiveBucket, $object,'testcontent'); + try{ + $this->ossClient->getObject($this->ArchiveBucket, $object); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('403', $e->getHTTPStatus()); + $this->assertEquals('InvalidObjectState', $e->getErrorCode()); + } + $result = $this->ossClient->restoreObject($this->ArchiveBucket, $object); + common::waitMetaSync(); + $this->assertEquals('202', $result['info']['http_code']); + + try{ + $this->ossClient->restoreObject($this->ArchiveBucket, $object); + }catch(OssException $e){ + $this->assertEquals('409', $e->getHTTPStatus()); + $this->assertEquals('RestoreAlreadyInProgress', $e->getErrorCode()); + } + } + + public function setUp() + { + parent::setUp(); // TODO: Change the autogenerated stub + $this->IABucket = 'ia-'.$this->bucket; + $this->ArchiveBucket = 'archive-'.$this->bucket; + $this->ossClient->createBucket($this->IABucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_IA); + $this->ossClient->createBucket($this->ArchiveBucket, OssClient::OSS_ACL_TYPE_PRIVATE, NULL, OssClient::OSS_STORAGE_TYPE_ARCHIVE); + } + + public function tearDown() + { + parent::tearDown(); // TODO: Change the autogenerated stub + $object = 'storage-object'; + $this->ossClient->deleteObject($this->IABucket, $object); + $this->ossClient->deleteObject($this->ArchiveBucket, $object); + $this->ossClient->deleteBucket($this->IABucket); + $this->ossClient->deleteBucket($this->ArchiveBucket); + } +} + + +