Files
liche/common/libraries/Qiniu.php
T
2023-02-08 17:36:46 +08:00

253 lines
7.9 KiB
PHP
Executable File

<?php
/**
* Created by PhpStorm.
* User: linfan
* Date: 2018-11-24
* Time: 21:46
*/
defined('BASEPATH') OR exit('No direct script access allowed');
require_once COMMPATH.'third_party/Qiniu/autoload.php';
class Qiniu{
private $config;
public function __construct($config = array())
{
$CI = & get_instance();
$CI->config->load('qiniu', true, true);
$type = isset($config['type'])?$config['type']:'';
$qiniu_config = $CI->config->item('qiniu');
switch ($type){
case 'video':
$this->config = $qiniu_config['video'];
break;
default:
$this->config = $qiniu_config['img'];
}
}
public function getConfig()
{
return $this->config;
}
/**
* 获取文件当前URL地址
* @param string $filename
* @param string|null $storage
* @return bool|string
* @throws Exception
*/
public function getFileUrl($filename)
{
$auth = new \Qiniu\Auth($this->config['access_key'], $this->config['secret_key']);
$bucketMgr = new \Qiniu\Storage\BucketManager($auth);
list($ret, $err) = $bucketMgr->stat($this->config['bucket'], $filename);
return $err === null ? $this->getBaseUriQiniu().$filename : false;
}
/**
* 根据配置获取到七牛云文件上传目标地址
* @param bool $isClient
* @return string
* @throws Exception
*/
public function getUploadQiniuUrl($isClient = true)
{
$region = $this->config['region'];
$isHttps = !!$this->config['is_https'];
switch ($region)
{
case '华东':
if ($isHttps)
{
return $isClient ? 'https://upload.qiniup.com' : 'https://upload.qiniup.com';
}
return $isClient ? 'http://upload.qiniup.com' : 'http://upload.qiniup.com';
case '华北':
if ($isHttps)
{
return $isClient ? 'https://upload-z1.qiniup.com' : 'https://up-z1.qiniup.com';
}
return $isClient ? 'http://upload-z1.qiniup.com' : 'http://up-z1.qiniup.com';
case '北美':
if ($isHttps)
{
return $isClient ? 'https://upload-na0.qiniup.com' : 'https://up-na0.qiniup.com';
}
return $isClient ? 'http://upload-na0.qiniup.com' : 'http://up-na0.qiniup.com';
case '华南':
default:
if ($isHttps)
{
return $isClient ? 'https://upload-z2.qiniup.com' : 'https://up-z2.qiniup.com';
}
return $isClient ? 'http://upload-z2.qiniup.com' : 'http://up-z2.qiniup.com';
}
}
/**
* 获取七牛云URL前缀
* @return string
* @throws Exception
*/
public function getBaseUriQiniu()
{
switch (strtolower($this->config['is_https']))
{
case 'https':
return 'https://' . $this->config['domain'].DIRECTORY_SEPARATOR;
case 'http':
return 'http://' . $this->config['domain'].DIRECTORY_SEPARATOR;
default:
return '//' . $this->config['domain'].DIRECTORY_SEPARATOR;
}
}
/**
* 根据Key读取文件内容
* @param string $filename
* @param string|null $storage
* @return string|null
* @throws Exception
*/
public function readFile($filename)
{
$auth = new \Qiniu\Auth($this->config['access_key'], $this->config['secret_key']);
return file_get_contents($auth->privateDownloadUrl($this->getBaseUriQiniu() . $filename));
}
/**
* 获取文件相对名称
* @param string $local_url 文件标识
* @param string $ext 文件后缀
* @param string $pre 文件前缀(若有值需要以/结尾)
* @return string
*/
public function getFileName($local_url, $ext = '', $pre = '')
{
empty($ext) && $ext = strtolower(pathinfo($local_url, 4));
return $pre . join('/', str_split(md5($local_url), 16)) . '.' . ($ext ? $ext : 'tmp');
}
/**
* 存储图片
* @param $filename
* @param $content
* @return |null
* @throws Exception
*/
public function save($filename, $content)
{
$auth = new \Qiniu\Auth($this->config['access_key'], $this->config['secret_key']);
$token = $auth->uploadToken($this->config['bucket']);
$filename = $this->config['attch'].$filename;
$uploadMgr = new \Qiniu\Storage\UploadManager();
list($result, $err) = $uploadMgr->put($token, $filename, $content);
/*edit by xuxianbin 19900819 文件存在可以直接返回*/
if ($err !== null && 'file exists' != $err->message())
{
debug_log('七牛云文件上传失败, ' . $err->message() . '; filename=' . $filename);
return null;
}
$result['file'] = $filename;
$result['url'] = $this->getBaseUriQiniu() . $filename;
return $result;
}
/**
* 删除图片
* @param $filename
* @return bool
*/
public function rm($filename){
$auth = new \Qiniu\Auth($this->config['access_key'], $this->config['secret_key']);
$filename = $this->config['attch'].$filename;
//初始化BucketManager
$bucketMgr = new \Qiniu\Storage\BucketManager($auth);
$err = $bucketMgr->delete($this->config['bucket'], $filename);
if ($err !== null)
{
debug_log("七牛云文件删除失败, " . $err->message(). "; filename={$filename}");
return false;
}
return true;
}
/**
* 获取文件信息
* @param $filename
* @return mixed
*/
public function getInfo($filename){
$auth = new \Qiniu\Auth($this->config['access_key'], $this->config['secret_key']);
$bucketMgr = new \Qiniu\Storage\BucketManager($auth);
$filename = $this->config['attch'].$filename;
list($fileInfo, $err) = $bucketMgr->stat($this->config['bucket'], $filename);
if ($err) {
debug_log("七牛云获取文件信息失败, " . $err->message(). "; filename={$filename}");
return null;
}
return $fileInfo;
}
/**
* 抓取网络图片
* @param $url
* @param $filename
* @return array
*/
public function fetch($url, $filename){
$auth = new \Qiniu\Auth($this->config['access_key'], $this->config['secret_key']);
$filename = $this->config['attch'].$filename;
//初始化BucketManager
$bucketMgr = new \Qiniu\Storage\BucketManager($auth);
list($result, $err) = $bucketMgr->fetch($url, $this->config['bucket'], $filename);
if ($err !== null && 'file exists' != $err->message())
{
debug_log('七牛云抓取网络文件失败, ' . $err->message() . ";url={$url}; filename=" . $filename);
return array();
}
$result['file'] = $filename;
$result['url'] = $this->getBaseUriQiniu() . $filename;
return $result;
}
/**
* 获取token
* @param $filename
* @return string
* @throws Exception
*/
public function getToken($filename)
{
$baseUrl = $this->getBaseUriQiniu();
$bucket = $this->config['bucket'];
$accessKey = $this->config['access_key'];
$secretKey = $this->config['secret_key'];
$params = array(
"scope" => "{$bucket}:{$filename}", "deadline" => 3600 + time(),
"returnBody" => "{\"data\":{\"site_url\":\"{$baseUrl}$(key)\",\"file_url\":\"$(key)\"}, \"code\": \"SUCCESS\"}",
);
$data = str_replace(array('+', '/'), array('-', '_'), base64_encode(json_encode($params)));
return $accessKey . ':' . str_replace(array('+', '/'), array('-', '_'), base64_encode(hash_hmac('sha1', $data, $secretKey, true))) . ':' . $data;
}
}