@ -4,26 +4,33 @@
date_default_timezone_set('Asia/Shanghai');
date_default_timezone_set('Asia/Shanghai');
//检测API路径
//检测API路径
if(!defined("KS3_API_PATH"))
if (!defined("KS3_API_PATH")) {
define("KS3_API_PATH", dirname(__FILE__));
define("KS3_API_PATH", __DIR__);
}
//是否使用VHOST
//是否使用VHOST
if(!defined("KS3_API_VHOST"))
if (!defined("KS3_API_VHOST")) {
define("KS3_API_VHOST",TRUE);
define("KS3_API_VHOST", FALSE);
}
//是否开启日志(写入日志文件)
//是否开启日志(写入日志文件)
if(!defined("KS3_API_LOG"))
if (!defined("KS3_API_LOG")) {
define("KS3_API_LOG",TRUE);
define("KS3_API_LOG", FALSE);
}
//是否显示日志(直接输出日志)
//是否显示日志(直接输出日志)
if(!defined("KS3_API_DISPLAY_LOG"))
if (!defined("KS3_API_DISPLAY_LOG")) {
define("KS3_API_DISPLAY_LOG", TRUE);
define("KS3_API_DISPLAY_LOG", FALSE);
}
//定义日志目录(默认是该项目log下)
//定义日志目录(默认是该项目log下)
if(!defined("KS3_API_LOG_PATH"))
if (!defined("KS3_API_LOG_PATH")) {
define("KS3_API_LOG_PATH", "");
define("KS3_API_LOG_PATH", "");
}
//是否使用HTTPS
//是否使用HTTPS
if(!defined("KS3_API_USE_HTTPS"))
if (!defined("KS3_API_USE_HTTPS")) {
define("KS3_API_USE_HTTPS", FALSE);
define("KS3_API_USE_HTTPS", FALSE);
}
//是否开启curl debug模式
//是否开启curl debug模式
if(!defined("KS3_API_DEBUG_MODE"))
if (!defined("KS3_API_DEBUG_MODE")) {
define("KS3_API_DEBUG_MODE", FALSE);
define("KS3_API_DEBUG_MODE", FALSE);
}
define("KS3_API_Author", "lijunwei@kingsoft.com");
define("KS3_API_Author", "lijunwei@kingsoft.com");
define("KS3_API_Version", "1.2");
define("KS3_API_Version", "1.2");
@ -42,10 +49,10 @@ if(function_exists('get_loaded_extensions')){
//检测curl扩展
//检测curl扩展
$extensions = get_loaded_extensions();
$extensions = get_loaded_extensions();
if ($extensions) {
if ($extensions) {
if(!in_array('curl', $extensions)) {
if (!in_array('curl', $extensions, true)) {
throw new Ks3ClientException("please install curl extension");
throw new Ks3ClientException("please install curl extension");
}
}
if(!in_array('mbstring', $extensions)) {
if (!in_array('mbstring', $extensions, true)) {
throw new Ks3ClientException("please install mbstring extension");
throw new Ks3ClientException("please install mbstring extension");
}
}
@ -56,12 +63,15 @@ if(function_exists('get_loaded_extensions')){
throw new Ks3ClientException();
throw new Ks3ClientException();
}
}
class Ks3Client{
class Ks3Client
{
private $accessKey;
private $accessKey;
private $secretKey;
private $secretKey;
private $endpoint;
private $endpoint;
private $log;
private $log;
public function __construct($accessKey = NULL, $secretKey = NULL, $endpoint = NULL ){
public function __construct($accessKey = NULL, $secretKey = NULL, $endpoint = NULL)
{
$this->accessKey = $accessKey;
$this->accessKey = $accessKey;
$this->secretKey = $secretKey;
$this->secretKey = $secretKey;
@ -73,42 +83,48 @@ class Ks3Client{
$this->signers = array();
$this->signers = array();
$this->log = new Logger();
$this->log = new Logger();
}
}
/**
/**
方法列表:(具体使用请参考readme.md)
* 方法列表:(具体使用请参考readme.md)
listBuckets,罗列bucket
* listBuckets,罗列bucket
deleteBucket, 删除bucket
* deleteBucket, 删除bucket
deleteBucketCORS, 删除bucket跨域配置
* deleteBucketCORS, 删除bucket跨域配置
createBucket,新建bucket
* createBucket,新建bucket
setBucketAcl, 设置bucket访问权限
* setBucketAcl, 设置bucket访问权限
setBucketCORS,设置bucket跨域配置
* setBucketCORS,设置bucket跨域配置
setBucketLogging,设置bucket日志配置
* setBucketLogging,设置bucket日志配置
listObjects,罗列object
* listObjects,罗列object
getBucketAcl,获取bucket访问权限
* getBucketAcl,获取bucket访问权限
getBucketCORS,获取bucket跨域配置
* getBucketCORS,获取bucket跨域配置
getBucketLocation,获取bucket地点配置
* getBucketLocation,获取bucket地点配置
getBucketLogging,获取bucket日志配置
* getBucketLogging,获取bucket日志配置
bucketExists,判断bucket是否存在
* bucketExists,判断bucket是否存在
listMutipartUploads,罗列当前bucket下尚未结束的分块上传
* listMutipartUploads,罗列当前bucket下尚未结束的分块上传
putObjectByContent,上传文件
* putObjectByContent,上传文件
putObjectByFile,上传文件
* putObjectByFile,上传文件
setObjectAcl, 设置object访问权限
* setObjectAcl, 设置object访问权限
copyObject,复制object
* copyObject,复制object
getObjectMeta, 获取object元数据
* getObjectMeta, 获取object元数据
objectExists, 判断object是否存在
* objectExists, 判断object是否存在
deleteObject, 删除object
* deleteObject, 删除object
deleteObjects, 删除多个object
* deleteObjects, 删除多个object
getObject, 下载object
* getObject, 下载object
getObjectAcl, 获取object访问权限
* getObjectAcl, 获取object访问权限
initMultipartUpload, 初始化分块上传
* initMultipartUpload, 初始化分块上传
uploadPart, 上传块
* uploadPart, 上传块
abortMultipartUpload, 终止分块上传
* abortMultipartUpload, 终止分块上传
listParts, 罗列已经上传的块
* listParts, 罗列已经上传的块
completeMultipartUpload, 完成分块上传
* completeMultipartUpload, 完成分块上传
generatePresignedUrl, 生成文件外链
* generatePresignedUrl, 生成文件外链
putAdp,添加异步数据处理任务
* putAdp,添加异步数据处理任务
getAdp,查询异步数据处理任务
* getAdp,查询异步数据处理任务
* @param $method
* @param array $args
* @return ResponseCore|string|string[]|null
* @throws Exception
*/
*/
public function __call($method,$args=array()){
public function __call($method, $args = array())
{
$holder = new MessageHolder();
$holder = new MessageHolder();
$holder->msg = "------------------Logging Start-------------------------\r\n";
$holder->msg = "------------------Logging Start-------------------------\r\n";
@ -122,11 +138,14 @@ class Ks3Client{
}
}
$holder->msg .= "------------------Logging End-------------------------\r\n";
$holder->msg .= "------------------Logging End-------------------------\r\n";
$this->log->info($holder->msg);
$this->log->info($holder->msg);
if($ex !=NULL)
if ($ex != NULL) {
throw $ex;
throw $ex;
}
return $result;
return $result;
}
}
private function invoke($method,$args=array(),$holder,$location=NULL){
private function invoke($method, $args = array(), $holder, $location = NULL)
{
$api = API::$API[$method];
$api = API::$API[$method];
if (!$api) {
if (!$api) {
throw new Ks3ClientException($method . " Not Found API");
throw new Ks3ClientException($method . " Not Found API");
@ -148,11 +167,7 @@ class Ks3Client{
} else {
} else {
$request->bucket = $args["Bucket"];
$request->bucket = $args["Bucket"];
}
}
$position = "Key";
$position = $api["objectPostion"] ?? "Key";
//position主要为queryadp接口用的
if(isset($api["objectPostion"])){
$position = $api["objectPostion"];
}
if (empty($args[$position])) {
if (empty($args[$position])) {
if ($api["needObject"]) {
if ($api["needObject"]) {
throw new Ks3ClientException($method . " this api need " . $position);
throw new Ks3ClientException($method . " this api need " . $position);
@ -161,13 +176,13 @@ class Ks3Client{
$key = $args[$position];
$key = $args[$position];
$preEncoding = mb_detect_encoding($key, array("ASCII", "UTF-8", "GB2312", "GBK", "BIG5"));
$preEncoding = mb_detect_encoding($key, array("ASCII", "UTF-8", "GB2312", "GBK", "BIG5"));
$holder->msg .= "key encoding " . $preEncoding . "\r\n";
$holder->msg .= "key encoding " . $preEncoding . "\r\n";
if(strtolower($preEncoding) != "utf-8") {
if (strtolower($preEncoding) !== "utf-8") {
$key = iconv($preEncoding, "UTF-8", $key);
$key = iconv($preEncoding, "UTF-8", $key);
}
}
$request->key = $key;
$request->key = $key;
}
}
$method = $api["method"];
$method = $api["method"];
if($method == "Method") {
if ($method === "Method") {
if (empty($args["Method"])) {
if (empty($args["Method"])) {
$request->method = "GET";
$request->method = "GET";
} else {
} else {
@ -176,10 +191,12 @@ class Ks3Client{
} else {
} else {
$request->method = $api["method"];
$request->method = $api["method"];
}
}
if(KS3_API_USE_HTTPS)
if (KS3_API_USE_HTTPS) {
$request->scheme = "https://";
$request->scheme = "https://";
else
}
else {
$request->scheme = "http://";
$request->scheme = "http://";
}
$request->endpoint = $this->endpoint;
$request->endpoint = $this->endpoint;
//add subresource
//add subresource
if (!empty($api["subResource"])) {
if (!empty($api["subResource"])) {
@ -189,7 +206,7 @@ class Ks3Client{
if (isset($api["queryParams"])) {
if (isset($api["queryParams"])) {
foreach ($api["queryParams"] as $key => $value) {
foreach ($api["queryParams"] as $key => $value) {
$required = FALSE;
$required = FALSE;
if(substr($value,0,1)==="!") {
if (strpos($value, "!") === 0) {
$required = TRUE;
$required = TRUE;
$value = substr($value, 1);
$value = substr($value, 1);
}
}
@ -203,7 +220,7 @@ class Ks3Client{
} else {
} else {
$curkey = $value1;
$curkey = $value1;
//星号表示所有,按照暂时的业务,默认星号后面就没了
//星号表示所有,按照暂时的业务,默认星号后面就没了
if($curkey == "*") {
if ($curkey === "*") {
foreach ($curIndexArg as $queryK => $queryV) {
foreach ($curIndexArg as $queryK => $queryV) {
if (!is_array($queryV)) {
if (!is_array($queryV)) {
$request->addQueryParams($queryK, $queryV);
$request->addQueryParams($queryK, $queryV);
@ -212,19 +229,20 @@ class Ks3Client{
$add = FALSE;
$add = FALSE;
$required = FALSE;
$required = FALSE;
break;
break;
}else{
$curIndexArg = $curIndexArg[$value1];
}
}
$curIndexArg = $curIndexArg[$value1];
}
}
}
}
if (!empty($curIndexArg) & & $add) {
if (!empty($curIndexArg) & & $add) {
$request->addQueryParams($curkey, $curIndexArg);
$request->addQueryParams($curkey, $curIndexArg);
continue;
continue;
}
}
if($required)
if ($required) {
throw new Ks3ClientException($method . " param " . $value . " is required");
throw new Ks3ClientException($method . " param " . $value . " is required");
}
}
}
}
}
if (isset($api["body"])) {
if (isset($api["body"])) {
if (isset($api["body"]["builder"])) {
if (isset($api["body"]["builder"])) {
$builderName = $api["body"]["builder"];
$builderName = $api["body"]["builder"];
@ -267,11 +285,13 @@ class Ks3Client{
if ($signer === NULL || !($signer instanceof QueryAuthSigner)) {
if ($signer === NULL || !($signer instanceof QueryAuthSigner)) {
$url = $request->toUrl($this->endpoint);
$url = $request->toUrl($this->endpoint);
if($location!=NULL)
if ($location != NULL) {
$url = $location;
$url = $location;
}
$httpRequest = new RequestCore($url);
$httpRequest = new RequestCore($url);
if(KS3_API_DEBUG_MODE===TRUE)
if (KS3_API_DEBUG_MODE === TRUE) {
$httpRequest->debug_mode = TRUE;
$httpRequest->debug_mode = TRUE;
}
$httpRequest->set_method($request->method);
$httpRequest->set_method($request->method);
foreach ($request->headers as $key => $value) {
foreach ($request->headers as $key => $value) {
$httpRequest->add_header($key, $value);
$httpRequest->add_header($key, $value);
@ -288,8 +308,7 @@ class Ks3Client{
$read_stream = $request->read_stream;
$read_stream = $request->read_stream;
$read_length = $request->getHeader(Headers::$ContentLength);
$read_length = $request->getHeader(Headers::$ContentLength);
$seek_position = $request->seek_position;
$seek_position = $request->seek_position;
if(isset($read_stream))
if (isset($read_stream)) {
{
$httpRequest->set_read_stream($read_stream, $read_length);
$httpRequest->set_read_stream($read_stream, $read_length);
$httpRequest->set_seek_position($seek_position);
$httpRequest->set_seek_position($seek_position);
$httpRequest->remove_header(Headers::$ContentLength);
$httpRequest->remove_header(Headers::$ContentLength);
@ -312,7 +331,7 @@ class Ks3Client{
if ($data->status == 307) {
if ($data->status == 307) {
$respHeaders = $httpRequest->get_response_header();
$respHeaders = $httpRequest->get_response_header();
$location = $respHeaders["location"];
$location = $respHeaders["location"];
if(substr($location,0,4) == "http") {
if (strpos($location, "http") === 0) {
$holder->msg .= "response code->" . $httpRequest->get_response_code() . "\r\n";
$holder->msg .= "response code->" . $httpRequest->get_response_code() . "\r\n";
$holder->msg .= "response headers->" . serialize($httpRequest->get_response_header()) . "\r\n";
$holder->msg .= "response headers->" . serialize($httpRequest->get_response_header()) . "\r\n";
$holder->msg .= "response body->" . $body . "\r\n";
$holder->msg .= "response body->" . $body . "\r\n";
@ -330,14 +349,16 @@ class Ks3Client{
$data = $handler->handle($data);
$data = $handler->handle($data);
}
}
return $data;
return $data;
}else{
}
$url = $request->toUrl($this->endpoint);
$url = $request->toUrl($this->endpoint);
$holder->msg .= $url . "\r\n";
$holder->msg .= $url . "\r\n";
return $url;
return $url;
}
}
}
//用于生产表单上传时的签名信息
//用于生产表单上传时的签名信息
public function postObject($bucket ,$postFormData=array(),$unknowValueFormFiled=array(),$filename=NULL,$expire=18000){
public function postObject($bucket, $postFormData = array(), $unknowValueFormFiled = array(), $filename = NULL, $expire = 18000): array
{
$policy = array();
$policy = array();
$expireTime = Utils::iso8601(time() + $expire);
$expireTime = Utils::iso8601(time() + $expire);
@ -347,14 +368,14 @@ class Ks3Client{
foreach ($postFormData as $key => $value) {
foreach ($postFormData as $key => $value) {
$condition = array();
$condition = array();
$condition[$key] = str_replace("\${filename}", $filename, $value);
$condition[$key] = str_replace("\${filename}", $filename, $value);
array_push($conditions,$condition) ;
$conditions[] = $condition ;
}
}
foreach ($unknowValueFormFiled as $key => $value) {
foreach ($unknowValueFormFiled as $key => $value) {
$condition = array();
$condition = array();
array_push($condition,"starts-with") ;
$condition[] = "starts-with" ;
array_push($condition,"\$".$value) ;
$condition[] = "\$" . $value ;
array_push($condition,"") ;
$condition[] = "" ;
array_push($conditions,$condition) ;
$conditions[] = $condition ;
}
}
$policy["conditions"] = $conditions;
$policy["conditions"] = $conditions;
$json = json_encode($policy);
$json = json_encode($policy);
@ -367,4 +388,4 @@ class Ks3Client{
}
}
}
}
?>