diff --git a/samples/Object.php b/samples/Object.php index 68e1ed37..3bf024b0 100644 --- a/samples/Object.php +++ b/samples/Object.php @@ -30,6 +30,15 @@ $content = $ossClient->getObject($bucket, "b.file"); Common::println("b.file is fetched, the content is: " . $content); +// 给object添加symlink +$content = $ossClient->putSymlink($bucket, "test-symlink", "b.file"); +Common::println("test-symlink is created"); +Common::println($result['x-oss-request-id']); +Common::println($result['etag']); + +// 获取symlink +$content = $ossClient->getSymlink($bucket, "test-symlink"); +Common::println("test-symlink refer to : " . $content[OssClient::OSS_SYMLINK_TARGET]); // 下载object到本地文件 $options = array( @@ -81,7 +90,8 @@ deleteObject($ossClient, $bucket); deleteObjects($ossClient, $bucket); doesObjectExist($ossClient, $bucket); - +getSymlink($ossClient, $bucket); +putSymlink($ossClient, $bucket); /** * 创建虚拟目录 * @@ -266,6 +276,62 @@ function getObject($ossClient, $bucket) } } +/** + * put symlink + * + * @param OssClient $ossClient OssClient实例 + * @param string $bucket 存储空间名称 + * @return null + */ +function putSymlink($ossClient, $bucket) +{ + $symlink = "test-samples-symlink"; + $object = "test-samples-object"; + try { + $ossClient->putObject($bucket, $object, 'test-content'); + $ossClient->putSymlink($bucket, $symlink, $object); + $content = $ossClient->getObject($bucket, $symlink); + } catch (OssException $e) { + printf(__FUNCTION__ . ": FAILED\n"); + printf($e->getMessage() . "\n"); + return; + } + print(__FUNCTION__ . ": OK" . "\n"); + if ($content == 'test-content') { + print(__FUNCTION__ . ": putSymlink checked OK" . "\n"); + } else { + print(__FUNCTION__ . ": putSymlink checked FAILED" . "\n"); + } +} + +/** + * 获取symlink + * + * @param OssClient $ossClient OssClient实例 + * @param string $bucket 存储空间名称 + * @return null + */ +function getSymlink($ossClient, $bucket) +{ + $symlink = "test-samples-symlink"; + $object = "test-samples-object"; + try { + $ossClient->putObject($bucket, $object, 'test-content'); + $ossClient->putSymlink($bucket, $symlink, $object); + $content = $ossClient->getSymlink($bucket, $symlink); + } catch (OssException $e) { + printf(__FUNCTION__ . ": FAILED\n"); + printf($e->getMessage() . "\n"); + return; + } + print(__FUNCTION__ . ": OK" . "\n"); + if ($content[OssClient::OSS_SYMLINK_TARGET]) { + print(__FUNCTION__ . ": getSymlink checked OK" . "\n"); + } else { + print(__FUNCTION__ . ": getSymlink checked FAILED" . "\n"); + } +} + /** * get_object_to_local_file * diff --git a/src/OSS/OssClient.php b/src/OSS/OssClient.php index 6bfb863d..34cfb0bd 100644 --- a/src/OSS/OssClient.php +++ b/src/OSS/OssClient.php @@ -49,6 +49,7 @@ use OSS\Model\WebsiteConfig; use OSS\Core\OssUtil; use OSS\Model\ListPartsInfo; +use OSS\Result\SymlinkResult; /** * Class OssClient @@ -1095,6 +1096,49 @@ public function putObject($bucket, $object, $content, $options = NULL) return $result->getData(); } + /** + * 创建symlink + * @param string $bucket bucket名称 + * @param string $symlink symlink名称 + * @param string $targetObject 目标object名称 + * @param array $options + * @return null + */ + public function putSymlink($bucket, $symlink ,$targetObject, $options = NULL) + { + $this->precheckCommon($bucket, $symlink, $options); + + $options[self::OSS_BUCKET] = $bucket; + $options[self::OSS_METHOD] = self::OSS_HTTP_PUT; + $options[self::OSS_OBJECT] = $symlink; + $options[self::OSS_SUB_RESOURCE] = self::OSS_SYMLINK; + $options[self::OSS_HEADERS][self::OSS_SYMLINK_TARGET] = rawurlencode($targetObject); + + $response = $this->auth($options); + $result = new PutSetDeleteResult($response); + return $result->getData(); + } + + /** + * 获取symlink + *@param string $bucket bucket名称 + * @param string $symlink symlink名称 + * @return null + */ + public function getSymlink($bucket, $symlink) + { + $this->precheckCommon($bucket, $symlink, $options); + + $options[self::OSS_BUCKET] = $bucket; + $options[self::OSS_METHOD] = self::OSS_HTTP_GET; + $options[self::OSS_OBJECT] = $symlink; + $options[self::OSS_SUB_RESOURCE] = self::OSS_SYMLINK; + + $response = $this->auth($options); + $result = new SymlinkResult($response); + return $result->getData(); + } + /** * 上传本地文件 * @@ -2303,7 +2347,8 @@ private function generateSignableQueryStringParam($options) self::OSS_LIVE_CHANNEL_START_TIME, self::OSS_LIVE_CHANNEL_END_TIME, self::OSS_PROCESS, - self::OSS_POSITION + self::OSS_POSITION, + self::OSS_SYMLINK, ); foreach ($signableList as $item) { @@ -2563,6 +2608,11 @@ public function setConnectTimeout($connectTimeout) const OSS_DEFAULT_PREFIX = 'x-oss-'; const OSS_CHECK_MD5 = 'checkmd5'; const DEFAULT_CONTENT_TYPE = 'application/octet-stream'; + const OSS_SYMLINK_TARGET = 'x-oss-symlink-target'; + const OSS_SYMLINK = 'symlink'; + const OSS_HTTP_CODE = 'http_code'; + const OSS_REQUEST_ID = 'x-oss-request-id'; + const OSS_INFO = 'info'; //私有URL变量 const OSS_URL_ACCESS_KEY_ID = 'OSSAccessKeyId'; diff --git a/src/OSS/Result/SymlinkResult.php b/src/OSS/Result/SymlinkResult.php new file mode 100644 index 00000000..9c6d861a --- /dev/null +++ b/src/OSS/Result/SymlinkResult.php @@ -0,0 +1,24 @@ +rawResponse->header[OssClient::OSS_SYMLINK_TARGET] = rawurldecode($this->rawResponse->header[OssClient::OSS_SYMLINK_TARGET]); + return $this->rawResponse->header; + } +} + diff --git a/tests/OSS/Tests/OssClientBucketStorageCapacityTest.php b/tests/OSS/Tests/OssClientBucketStorageCapacityTest.php index 0a54a4ea..87548f97 100644 --- a/tests/OSS/Tests/OssClientBucketStorageCapacityTest.php +++ b/tests/OSS/Tests/OssClientBucketStorageCapacityTest.php @@ -11,7 +11,7 @@ public function testBucket() { try { $storageCapacity = $this->ossClient->getBucketStorageCapacity($this->bucket); - $this->assertEquals($storageCapacity, - 1); + $this->assertEquals($storageCapacity, -1); } catch (OssException $e) { $this->assertTrue(false); } @@ -45,11 +45,12 @@ public function testBucket() } try { - $this->ossClient->putBucketStorageCapacity($this->bucket, - 2); + $this->ossClient->putBucketStorageCapacity($this->bucket, -2); $this->assertTrue(false); } catch (OssException $e) { $this->assertEquals(400, $e->getHTTPStatus()); $this->assertEquals('InvalidArgument', $e->getErrorCode()); } } + } diff --git a/tests/OSS/Tests/OssClientTest.php b/tests/OSS/Tests/OssClientTest.php index 67d7c629..6bfcda7b 100644 --- a/tests/OSS/Tests/OssClientTest.php +++ b/tests/OSS/Tests/OssClientTest.php @@ -198,4 +198,5 @@ private function checkProxy($result, $proxys) $this->assertEquals($result['info']['primary_port'], $proxys['port']); $this->assertTrue(array_key_exists('via', $result)); } + } diff --git a/tests/OSS/Tests/SymlinkTest.php b/tests/OSS/Tests/SymlinkTest.php new file mode 100644 index 00000000..d257c948 --- /dev/null +++ b/tests/OSS/Tests/SymlinkTest.php @@ -0,0 +1,74 @@ +ossClient ->putObject($bucket, $object, 'test_content'); + $this->ossClient->putSymlink($bucket, $symlink, $object); + $result = $this->ossClient->getObject($bucket, $symlink); + $this->assertEquals('test_content', $result); + + $this->ossClient ->putObject($bucket, $special_object, 'test_content'); + $this->ossClient->putSymlink($bucket, $symlink, $special_object); + $result = $this->ossClient->getObject($bucket, $symlink); + $this->assertEquals('test_content', $result); + } + + public function testGetSymlink() + { + $bucket = getenv('OSS_BUCKET'); + $symlink = 'test-link'; + $object = 'exist_object^$#!~'; + + $result = $this->ossClient->getSymlink($bucket, $symlink); + $this->assertEquals($result[OssClient::OSS_SYMLINK_TARGET], $object); + $this->assertEquals('200', $result[OssClient::OSS_INFO][OssClient::OSS_HTTP_CODE]); + $this->assertTrue(isset($result[OssClient::OSS_ETAG])); + $this->assertTrue(isset($result[OssClient::OSS_REQUEST_ID])); + } + + public function testPutNullSymlink() + { + $bucket = getenv('OSS_BUCKET'); + $symlink = 'null-link'; + $object_not_exist = 'not_exist_object+$#!b不'; + $this->ossClient->putSymlink($bucket, $symlink, $object_not_exist); + + try{ + $this->ossClient->getObject($bucket, $symlink); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('The symlink target object does not exist', $e->getErrorMessage()); + } + } + + public function testGetNullSymlink() + { + $bucket = getenv('OSS_BUCKET'); + $symlink = 'null-link-new'; + + try{ + $result = $this->ossClient->getSymlink($bucket, $symlink); + $this->assertTrue(false); + }catch (OssException $e){ + $this->assertEquals('The specified key does not exist.', $e->getErrorMessage()); + } + } +} + +