diff --git a/spaces.php b/spaces.php index aa139dc..892c2ef 100644 --- a/spaces.php +++ b/spaces.php @@ -11,20 +11,24 @@ class SpacesConnect { function __construct($access_key, $secret_key, $spaceName = "", $region = "nyc3", $host = "digitaloceanspaces.com") { if(!empty($spaceName)) { $endpoint = "https://".$spaceName.".".$region.".".$host; - } + } else { $endpoint = "https://".$region.".".$host; } - $this->client = Aws\S3\S3Client::factory(array( - 'region' => $region, - 'version' => 'latest', - 'endpoint' => $endpoint, - 'credentials' => array( - 'key' => $access_key, - 'secret' => $secret_key, - ), - 'bucket_endpoint' => true - )); + try { + $this->client = Aws\S3\S3Client::factory(array( + 'region' => $region, + 'version' => 'latest', + 'endpoint' => $endpoint, + 'credentials' => array( + 'key' => $access_key, + 'secret' => $secret_key, + ), + 'bucket_endpoint' => true + )); + } catch (\Exception $e) { + $this->HandleAWSException($e); + } $this->space = $spaceName; $this->access_key = $access_key; $this->secret_key = $secret_key; @@ -39,23 +43,31 @@ class SpacesConnect { $region = $this->region; } $current_space = $this->space; - $this->setSpace($spaceName); - $success = $this->client->createBucket(array('Bucket' => $spaceName)); - $this->client->waitUntil('BucketExists', array('Bucket' => $spaceName)); - $this->setSpace($current_space); - return $success; + try { + $this->setSpace($spaceName); + $success = $this->client->createBucket(array('Bucket' => $spaceName)); + $this->client->waitUntil('BucketExists', array('Bucket' => $spaceName)); + $this->setSpace($current_space); + return $this->ObjReturn($success->toArray()); + } catch (\Exception $e) { + $this->HandleAWSException($e); + } } function listSpaces() { $current_space = $this->space; - $this->setSpace(NULL); - $spaceList = $this->client->listBuckets(); - $this->setSpace($current_space); - return $spaceList; + try { + $this->setSpace(NULL); + $spaceList = $this->client->listBuckets(); + $this->setSpace($current_space); + return $this->ObjReturn($spaceList->toArray()); + } catch (\Exception $e) { + $this->HandleAWSException($e); + } } function ChangeSpace($spaceName, $region = "", $host = "") { - setSpace($spaceName, $region, $host); + return setSpace($spaceName, $region, $host); } function setSpace($spaceName, $region = "", $host = "") { @@ -68,34 +80,50 @@ class SpacesConnect { $endpoint = "https://".$region.".".$host; $this->space = ""; } - $this->client = Aws\S3\S3Client::factory(array( - 'region' => $region, - 'version' => 'latest', - 'endpoint' => $endpoint, - 'credentials' => array( - 'key' => $this->access_key, - 'secret' => $this->secret_key, - ), - 'bucket_endpoint' => true - )); + try { + $this->client = Aws\S3\S3Client::factory(array( + 'region' => $region, + 'version' => 'latest', + 'endpoint' => $endpoint, + 'credentials' => array( + 'key' => $this->access_key, + 'secret' => $this->secret_key, + ), + 'bucket_endpoint' => true + )); + return $this->ObjReturn(true); + } catch (\Exception $e) { + $this->HandleAWSException($e); + } } function getSpaceName() { - return $this->space; + return $this->ObjReturn($this->space); } function downloadSpaceToDirectory($pathToDirectory) { + try { $this->client->downloadBucket($pathToDirectory, $this->space); + return $this->ObjReturn(true); + } catch (\Exception $e) { + $this->HandleAWSException($e); + } } function destroyThisSpace() { - $objects = $this->listObjects(); - foreach ($objects as $value) { - $key = $value["Key"]; - $this->deleteObject($key); - } - $this->client->deleteBucket(array('Bucket' => $this->space)); - $this->client->waitUntil('BucketNotExists', array('Bucket' => $this->space)); + try { + $objects = $this->listObjects(); + foreach ($objects as $value) { + $key = $value["Key"]; + $this->deleteObject($key); + } + $this->client->deleteBucket(array('Bucket' => $this->space)); + $this->client->waitUntil('BucketNotExists', array('Bucket' => $this->space)); + return $this->ObjReturn(true); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } @@ -103,63 +131,124 @@ class SpacesConnect { function listObjects() { - $objects = $this->client->getIterator('ListObjects', array( - 'Bucket' => $this->space - )); - $objectArray = array(); - foreach ($objects as $object) { - $objectArray[] = $object; - } - return $objectArray; + try { + $objects = $this->client->getIterator('ListObjects', array( + 'Bucket' => $this->space + )); + $objectArray = array(); + foreach ($objects as $object) { + $objectArray[] = $object; + } + return $this->ObjReturn($objectArray); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function doesObjectExist($objectName) { - return $this->client->doesObjectExist($this->space, $objectName); + try { + return $this->ObjReturn($this->client->doesObjectExist($this->space, $objectName)); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function getObject($file_name = "") { - $result = $this->client->getObject([ - 'Bucket' => $this->space, - 'Key' => $file_name, - ]); - return $result; + try { + $result = $this->client->getObject([ + 'Bucket' => $this->space, + 'Key' => $file_name, + ]); + return $this->ObjReturn($result->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } + } + + function makePrivate($file_path = "") { + try { + return $this->PutObjectACL($file_path, ["ACL" => "private"]); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } + } + + function makePublic($file_path = "") { + try { + return $this->PutObjectACL($file_path, ["ACL" => "public-read"]); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function deleteObject($file_path = "") { - return $this->client->deleteObject([ + try { + return $this->ObjReturn($this->client->deleteObject([ 'Bucket' => $this->space, 'Key' => $file_path, - ]); + ])->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } - function uploadFile($pathToFile, $fileName = "") { - if(empty($filename)) { + function uploadFile($pathToFile, $access = "private", $fileName = "") { + if(empty($fileName)) { $fileName = $pathToFile; } - $result = $this->client->putObject(array( - 'Bucket' => $this->space, - 'Key' => $fileName, - 'Body' => fopen($pathToFile, 'r+') - )); + if($access == "public") { + $access = "public-read"; + } + try { + $result = $this->client->putObject(array( + 'Bucket' => $this->space, + 'Key' => $fileName, + 'Body' => fopen($pathToFile, 'r+'), + "ACL" => $access + )); - $this->client->waitUntil('ObjectExists', array( - 'Bucket' => $this->space, - 'Key' => $fileName - )); + $this->client->waitUntil('ObjectExists', array( + 'Bucket' => $this->space, + 'Key' => $fileName + )); - return $result; + return $this->ObjReturn($result->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function downloadFile($fileName, $destinationPath) { + try { $result = $this->client->getObject(array( 'Bucket' => $this->space, 'Key' => $fileName, 'SaveAs' => $destinationPath )); + + return $this->ObjReturn($result->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function uploadDirectory($directory, $keyPrefix = "") { + try { $this->client->uploadDirectory($directory, $this->space, $keyPrefix); + + return $this->ObjReturn($result->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } @@ -168,10 +257,15 @@ class SpacesConnect { function listCORS() { - $cors = $this->client->getBucketCors([ - 'Bucket' => $this->space, - ]); - return $cors; + try { + $cors = $this->client->getBucketCors([ + 'Bucket' => $this->space, + ]); + return $this->ObjReturn($cors->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function putCORS($cors_rules = "") { @@ -182,37 +276,63 @@ class SpacesConnect { 'ExposeHeaders' => ['Access-Control-Allow-Origin'], ]; } - $result = $this->client->putBucketCors([ - 'Bucket' => $this->space, - 'CORSConfiguration' => ['CORSRules' => [$cors_rules]] - ]); - return $result; + try { + $result = $this->client->putBucketCors([ + 'Bucket' => $this->space, + 'CORSConfiguration' => ['CORSRules' => [$cors_rules]] + ]); + return $this->ObjReturn($result->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function listSpaceACL() { - $acl = $this->client->getBucketAcl([ - 'Bucket' => $this->space, - ]); - return $acl; + try { + $acl = $this->client->getBucketAcl([ + 'Bucket' => $this->space, + ]); + return $this->ObjReturn($acl->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function PutSpaceACL($params) { - $acl = $s3Client->putBucketAcl($params); - return $acl; + try { + $acl = $this->client->putBucketAcl($params); + return $this->ObjReturn($acl->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function listObjectACL($file) { - $result = $client->getObjectAcl([ + try { + $result = $this->client->getObjectAcl([ 'Bucket' => $this->space, 'Key' => $file, ]); - return $result; + return $this->ObjReturn($result->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } function PutObjectACL($file, $acl) { - $acl = array_merge (array("Bucket" => $this->bucket, "Key" => $file), $acl); - $result = $client->putObjectAcl($acl); + try { + $acl = array_merge(array("Bucket" => $this->space, "Key" => $file), $acl); + $result = $this->client->putObjectAcl($acl); + return $this->ObjReturn($result->toArray()); + } + catch (\Exception $e) { + $this->HandleAWSException($e); + } } @@ -239,6 +359,69 @@ class SpacesConnect { 'Signature' => $signature, )); $url .= "?".$queries; - return $url; + return $this->ObjReturn($url); + } + + + + function ObjReturn($return) { + $return = @json_decode(@json_encode($return), true); + $return = $this->AWSTime($return); + return $return; + } + + function AWSTime($obj) { + $time_keys = ["LastModified", "CreationDate", "Expires", "last-modified", "date", "Expiration"]; + if(is_array($obj)) { + foreach ($obj as $key => $value) { + if(is_array($obj[$key])) { + $obj[$key] = $this->AWSTime($obj[$key]); + } + else { + foreach ($time_keys as $time_key) { + if(array_key_exists($time_key, $obj) && !empty($obj[$time_key]) && !is_numeric($obj[$time_key])) { + $obj[$time_key] = strtotime($obj[$time_key]); + } + } + } + } + } + return $obj; + } + + private function any_key_exists($keys, $arr) { + foreach ($keys as $key) { + if(array_key_exists($key, $arr)) { + return true; + } + } + return false; + } + + + function HandleAWSException($e) { + if(get_class($e) == "Aws\S3\Exception\S3Exception") { + $error["error"] = [ + "message" => $e->getAwsErrorMessage(), + "code" => $e->getAwsErrorCode(), + "type" => $e->getAwsErrorType(), + "http_code" => $e->getStatusCode(), + ]; + } + else { + throw $e; + } + throw new SpacesAPIException(@json_encode($error)); + } + + function GetError($e) { + $error = @json_decode($e->getMessage(), true); + return $error["error"]; + } +} + +class SpacesAPIException extends \Exception { + public function __construct($message, $code = 0, Exception $previous = null) { + parent::__construct($message, $code, $previous); } }