qlg.tsgz.moe/oss/qiniu.php
2019-09-06 23:53:10 +08:00

295 lines
8.6 KiB
PHP
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
class SDK implements ArrayAccess {
const QINIU_UP_HOST = 'http://up.qiniu.com';
const QINIU_RS_HOST = 'http://rs.qbox.me';
const QINIU_RSF_HOST= 'http://rsf.qbox.me';
protected $deadline = 0;
//查看
//删除
//复制 x
//移动 x
//上传
protected $access_token ;
protected $secret_token ;
protected $bucket;
protected $cache = array();
protected $aliases = array(); //文件别名, 针对文件名比较长的文件
//curl
protected $ch;
protected $headers;
protected $options = array();
protected $response;
protected $info;
protected $errno;
protected $error;
public function __construct($access_token, $secret_token, $bucket = null)
{
$this->access_token = $access_token;
$this->secret_token = $secret_token;
$this->bucket = $bucket;
$this->deadline = time()+3600;
}
public function setDeadline($deadline)
{
$this->deadline = $deadline;
}
//获取空间名称
public function getBucket()
{
return $this->bucket;
}
//设置空间
public function setBucket($bucket)
{
$this->bucket = $bucket;
}
/**
* 查看指定文件信息。
* @param string $key 文件名或者目录+文件名
* @return Array|boolean 成功返回文件内容否会返回false.
*/
public function stat($key)
{
list($bucket, $key) = $this->parseKey($key);
if ( is_null($bucket) )
{
die('error');
}
$url = self::QINIU_RS_HOST .'/stat/' . $this->encode("$bucket:$key");
$token = $this->accessToken($url);
$options[CURLOPT_HTTPHEADER] = array('Authorization: QBox '. $token);
return $this->get($url, $options);
}
/**
* 删除指定文件信息。
* @param string $key 文件名或者目录+文件名
* @return NULL
*/
public function delete($key)
{
list($bucket, $key) = $this->parseKey($key);
if ( is_null($bucket) )
{
die('error');
}
$url = self::QINIU_RS_HOST .'/delete/' . $this->encode("$bucket:$key");
$token = $this->accessToken($url);
$options[CURLOPT_HTTPHEADER] = array('Authorization: QBox '. $token);
return $this->get($url, $options);
}
public function upload($file, $name=null, $token = null)
{
if ( NULL === $token )
{
$token = $this->uploadToken($this->bucket);
}
if ( !file_exists($file) )
{
die('文件不存在,构建一个临时文件');
}
$hash = hash_file('crc32b', $file);
$array = unpack('N', pack('H*', $hash));
$postFields = array(
'token' => $token,
'file' => '@'.$file,
'key' => $name,
'crc32' => sprintf('%u', $array[1]),
);
//未指定文件名,使用七牛默认的随机文件名
if ( NULL === $name )
{
unset($postFields['key']);
}
else
{
//设置文件名后缀。
}
$options = array(
CURLOPT_POSTFIELDS => $postFields,
);
return $this->get(self::QINIU_UP_HOST, $options);
}
protected function parseKey($key)
{
$key = $this->getAlias($key);
if ( isset($this->cache[$key]) )
{
return $this->cache[$key];
}
$segments = explode("|", $key);
if ( count($segments) === 1 )
{
$this->cache[$key] = array($this->bucket, $segments[0]);
}
else
{
$temp = implode('|', array_slice($segments, 1));
$this->cache[$key] = array($segments[0], $temp);
}
return $this->cache[$key];
}
public function getAlias($key)
{
return isset($this->aliases[$key]) ? $this->aliases[$key] : $key;
}
public function uploadToken($config = array())
{
if ( is_string($config) )
{
$scope = $config;
$config = array();
}
else
{
$scope = $config['scope'];
}
$config['scope'] = $scope;
//硬编码,需修改。
$config['deadline'] = $this->deadline;
foreach ( $this->activeUploadSettings($config) as $key => $value )
{
if ( $value )
{
$config[$key] = $value;
}
}
//build token
$body = json_encode($config);
$body = $this->encode($body);
$sign = hash_hmac('sha1', $body, $this->secret_token, true);
return $this->access_token . ':' . $this->encode($sign) . ':' .$body;
}
public function uploadSettings()
{
return array(
'scope','deadline','callbackUrl', 'callbackBody', 'returnUrl',
'returnBody', 'asyncOps', 'endUser', 'exclusive', 'detectMime',
'fsizeLimit', 'saveKey', 'persistentOps', 'persistentNotifyUrl'
);
}
protected function activeUploadSettings($array)
{
return array_intersect_key($array, array_flip($this->uploadSettings()));
}
public function accessToken($url, $body = false)
{
$url = parse_url($url);
$result = '';
if (isset($url['path'])) {
$result = $url['path'];
}
if (isset($url['query'])) {
$result .= '?' . $url['query'];
}
$result .= "\n";
if ($body) {
$result .= $body;
}
$sign = hash_hmac('sha1', $result, $this->secret_token, true);
return $this->access_token . ':' . $this->encode($sign);
}
public function get($url, $options = array())
{
$this->ch = curl_init();
$this->options[CURLOPT_URL] = $url;
$this->options = $options + $this->options;
//临时处理逻辑
return $this->execute();
}
protected function execute()
{
if ( !$this->option(CURLOPT_RETURNTRANSFER) )
{
$this->option(CURLOPT_RETURNTRANSFER, true);
}
if ( !$this->option(CURLOPT_SSL_VERIFYPEER) )
{
$this->option(CURLOPT_SSL_VERIFYPEER, false);
}
if ( !$this->option(CURLOPT_SSL_VERIFYHOST) )
{
$this->option(CURLOPT_SSL_VERIFYHOST, false);
}
if ( !$this->option(CURLOPT_CUSTOMREQUEST) )
{
$this->option(CURLOPT_CUSTOMREQUEST, 'POST');
}
if ( $this->headers )
{
$this->option(CURLOPT_HTTPHEADER, $this->headers);
}
$this->setupCurlOptions();
$this->response = curl_exec($this->ch);
$this->info = curl_getinfo($this->ch);
if ( $this->response === false )
{
$this->error = curl_error($this->ch);
$this->errno = curl_errno($this->ch);
curl_close($this->ch);
return false;
}
else
{
curl_close($this->ch);
//未处理http_code。
if ( $this->info['content_type'] == 'application/json' )
{
$this->response = json_decode($this->response, true);
}
return $this->response;
}
}
public function setupCurlOptions()
{
curl_setopt_array($this->ch, $this->options);
}
public function option($key, $value = NULL)
{
if ( is_null($value) )
{
return !isset($this->options[$key]) ? null: $this->options[$key];
}
else
{
$this->options[$key] = $value;
return $this;
}
}
public function alias($key, $value)
{
$this->alias[$key] = $value;
}
protected function encode($str)
{
$trans = array("+" => "-", "/" => "_");
return strtr(base64_encode($str), $trans);
}
public function __get($key)
{
return $this->$key;
}
public function offsetExists($key)
{
//check response;
}
public function offsetGet($key)
{
return $this->stat($key);
}
public function offsetSet($key, $value)
{
//move or copy
}
public function offsetUnset($key)
{
return $this->delete();
}
}
$access_token = 's0etbUw8isXaxMNp1hM02Ud1RLpeBzS6I_gVDMlR';
$secret_token = 'Ix9LwSpAk0QpsH2vAMup0QLEKMVK5UstDxWCIb-_';
$bucket = 'qlgmall';
$ql = new SDK($access_token, $secret_token, $bucket);
$response['token'] = $ql->uploadToken($bucket);
$response['url'] = 'http://qlg.ect99.com/';//'http://ppzpdlj0h.bkt.clouddn.com';
echo json_encode($response);