七牛API

<?php
/**
 * 七牛API
 */

abstract class Qiniu
{
	private static $ak = '';
	private static $sk = '';

	/**
	 * 安全的base64編碼
	 */
	private static function safeBase64Encode($str)
	{
		$find = array("+", "/");
		$replace = array("-", "_");
		return str_replace($find, $replace, base64_encode($str));
	}

	/**
	 * 安全的base64解碼
	 */
	private static function safeBase64Decode($str)
	{
		$find = array("-", "_");
		$replace = array("+", "/");
		return base64_decode(str_replace($find, $replace, $str));
	}

	private static function hmac_sha1($str, $key)
	{
		return hash_hmac("sha1", $str, $key, true);
	}

	/**
	 * 管理憑證
	 * @param $url 要上傳的URL
	 * @param $body POST時的內容
	 */
	private static function getAccessToken($url, $body = array())
	{
		$urlInfo = parse_url($url);
		$signingStr = $urlInfo['path'];
		if(!empty($urlInfo['query']))
		{
			$signingStr .= '?' . $urlInfo['query'];
		}
		$signingStr .= "\n";

		if(!empty($body))
		{
			$signingStr .= http_build_query($body);
		}

		$sign = self::safeBase64Encode(self::hmac_sha1($signingStr, self::$sk));
		$accessToken = self::$ak . ":" . $sign;

		return $accessToken;
	}

	/**
	 * 上傳文件(非視頻)憑證
	 */
	public static function getUploadFileToken($scope, $extTime = 43200, $returnUrl = '', $callbackUrl = '')
	{
		$policy = array();
		$policy['scope'] = $scope;
		$policy['deadline'] = time() + $extTime;

		$body = array();
		$body['key'] = '$(key)';
		$body['name'] = '$(fname)';
		$body['size'] = '$(fsize)';
		$body['mime'] = '$(mimeType)';
		$body['suffix'] = '$(suffix)';
		$body['hash'] = '$(etag)';
		$body['width'] = '$(imageInfo.width)';
		$body['height'] = '$(imageInfo.height)';


		if(!empty($returnUrl))
		{
			$body['exif'] = '$(exif)';
			$body['imageInfo'] = '$(imageInfo)';
			$body['imageAve'] = '$(imageAve)';
		}

		if(!empty($callbackUrl))
		{
			$body['exif'] = '$(exif)';
			$body['imageInfo'] = '$(imageInfo)';
			$body['imageAve'] = '$(imageAve)';

			$policy['callbackUrl'] = $callbackUrl;
			$policy['callbackBody'] = json_encode($body);
		}
		else
		{
			$policy['returnUrl'] = $returnUrl;
			$policy['returnBody'] = json_encode($body);
		}

		$putPolicy = self::safeBase64Encode(json_encode($policy));
		$sign = self::safeBase64Encode(self::hmac_sha1($putPolicy, self::$sk));
		$uploadToken = self::$ak . ':' . $sign . ':' . $putPolicy;

		return $uploadToken;
	}

	/**
	 * 視頻上傳憑證
	 * markPos位置:
	 * NorthWest	|	North	|	NorthEast
	 * West		|	Center	|	East
	 * SouthWest	|	South	|	SouthEast
	 */
	public static function getUploadMediaToken($scope, $extTime = 43200, $notifyUrl, $mark = '', $markPos = 'NorthEast')
	{
		$policy = array();
		$policy['scope'] = $scope;
		$policy['deadline'] = time() + $extTime;

		$ops = array();
		if(!empty($mark))
		{
			$ops[] = 'avthumb/mp4/wmImage/' . self::safeBase64Encode($mark) . '/Gravity/' . $markPos;		//轉碼成MP4
			$ops[] = 'avthumb/m3u8/preset/video_1000k/wmImage/' . self::safeBase64Encode($mark) . '/Gravity/' . $markPos;	//轉碼成M3U8
		}
		else
		{
			$ops[] = 'avthumb/mp4';
			$ops[] = 'avthumb/m3u8/preset/video_1000k';
		}

		$policy['persistentOps'] = implode(';', $ops);
		$policy['persistentNotifyUrl'] = $notifyUrl;

		$putPolicy = self::safeBase64Encode(json_encode($policy));
		$sign = self::safeBase64Encode(self::hmac_sha1($putPolicy, self::$sk));
		$uploadToken = self::$ak . ':' . $sign . ':' . $putPolicy;

		return $uploadToken;
	}

	/**
	 * 下載憑證(私有空間時使用)
	 */
	public static function getDownloadToken($url, $extTime = 43200)
	{
		$e = 'e=' . (time() + $extTime);
		if(preg_match('/\?/ism', $url))
		{
			$url .= '&' . $e;
		}
		else
		{
			$url .= '?' . $e;
		}

		$sign = self::safeBase64Encode(self::hmac_sha1($url, self::$sk));
		$downloadToken = self::$ak . ":" . $sign;
		//$realDownloadUrl = $url . '&token=' . $downloadToken;

		return $e . '&token=' . $downloadToken;
	}

	/**
	 * 查詢處理狀態
	 */
	public static function getPersistentInfo($persistentID)
	{
		$url = 'http://api.qiniu.com/status/get/prefop?id=' . $persistentID;

		$html = Http::request(array('url' => $url));
		$json = json_decode($html['html'], true);
		if(empty($json['code']))
		{
			return array();
		}
		else
		{
			return $json;
		}
	}

	/**
	 * 觸發式音視頻轉換
	 * 水印:avthumb/wmImage/safeBase64Encode(image url)/Gravity/位置
	 * 位置:
	 * NorthWest	|	North	|	NorthEast
	 * West		|	Center	|	East
	 * SouthWest	|	South	|	SouthEast
	 */
	public static function convertMedia($scope, $key, $notifyUrl, $mark = '', $markPos = 'NorthEast')
	{
		$url = "http://api.qiniu.com/pfop/";

		$ops = array();
		if(!empty($mark))
		{
			$ops[] = 'avthumb/mp4/wmImage/' . self::safeBase64Encode($mark) . '/Gravity/' . $markPos;		//轉碼成MP4
			$ops[] = 'avthumb/m3u8/preset/video_1000k/wmImage/' . self::safeBase64Encode($mark) . '/Gravity/' . $markPos;	//轉碼成M3U8
		}
		else
		{
			$ops[] = 'avthumb/mp4';
			$ops[] = 'avthumb/m3u8/preset/video_1000k';
		}

		$data = array();
		$data['bucket'] = $scope;
		$data['key'] = $key;
		$data['fops'] = implode(';', $ops);
		$data['notifyURL'] = $notifyUrl;

		$accessToken = self::getAccessToken($url, $data);

		$header = array();
		$header[] = 'Authorization: QBox ' . $accessToken;

		$html = Http::request(array('url' => $url, 'data' => $data, 'httpheader' => $header));
		$json = json_decode($html['html'], true);
		if(empty($json['persistentId']))
		{
			return '';
		}
		else
		{
			return $json['persistentId'];
		}
	}

	/**
	 * 視頻截圖
	 * 截圖:vframe/(jpg|png)/offset/秒數/w/寬/h/高/rotate/旋轉(空|90|180|270|auto)
	 */
	public static function getVideoImage($scope, $key, $notifyUrl, $second, $width, $height, $rotate = '')
	{
		$url = "http://api.qiniu.com/pfop/";

		$data = array();
		$data['bucket'] = $scope;
		$data['key'] = $key;

		$data['fops'] = sprintf('vframe/jpg/offset/%s/w/%s/h/%s', $second, $width, $height);
		if(!empty($rotate))
		{
			$data['fops'] .= $data['fops'] . '/rotate/' . $rotate;
		}

		$data['notifyURL'] = $notifyUrl;

		$accessToken = self::getAccessToken($url, $data);

		$header = array();
		$header[] = 'Authorization: QBox ' . $accessToken;

		$html = Http::request(array('url' => $url, 'data' => $data, 'httpheader' => $header));
		//http://api.qiniu.com/status/get/prefop?id=53b05821c868fc3b200498ba
		$json = json_decode($html['html'], true);
		if(empty($json['persistentId']))
		{
			return '';
		}
		else
		{
			return $json['persistentId'];
		}
	}

	/**
	 * 獲得音視頻信息
	 */
	public static function getMediaInfo($scope, $key, $private = false, $extTime = 3600)
	{
		if(preg_match('/\?/ism', $url))
		{
			$url = 'http://' . $scope . '.qiniudn.com/' . $key . '&avinfo';
		}
		else
		{
			$url = 'http://' . $scope . '.qiniudn.com/' . $key . '?avinfo';
		}

		if($private)
		{
			$url .= '&' . self::getDownloadToken($url, $extTime);
		}

		$html = Http::request(array('url' => $url));
		$json = json_decode($html['html'], true);

		if(empty($json['streams']))
		{
			return array();
		}
		else
		{
			return $json;
		}
	}

	/**
	 * 獲得圖片信息
	 */
	public static function getImageInfo($scope, $key, $private = false, $extTime = 120)
	{
		$url = 'http://' . $scope . '.qiniudn.com/' . $key . '?imageInfo';

		if($private)
		{
			$url .= '&' . self::getDownloadToken($url, $extTime);
		}

		$html = Http::request(array('url' => $url));
		$json = json_decode($html['html'], true);
		if(empty($json['format']))
		{
			return array();
		}
		else
		{
			return $json;
		}
	}

	/**
	 * 獲得圖片Exif
	 */
	public static function getImageExif($scope, $key, $private = false, $extTime = 120)
	{
		$url = 'http://' . $scope . '.qiniudn.com/' . $key . '?exif';

		if($private)
		{
			$url .= '&' . self::getDownloadToken($url, $extTime);
		}

		$html = Http::request(array('url' => $url));
		$json = json_decode($html['html'], true);
		if(empty($json['error']))
		{
			return $json;
		}
		else
		{
			return array();
		}
	}

	/**
	 * 獲得圖片主顏色(RGB值)
	 */
	public static function getImageRGB($scope, $key, $private = false)
	{
		$url = 'http://' . $scope . '.qiniudn.com/' . $key . '?imageAve';
		if($private)
		{
			$url .= '&' . self::getDownloadToken($url);
		}

		$html = Http::request(array('url' => $url));
		$json = json_decode($html['html'], true);
		if(empty($json['RGB']))
		{
			return '';
		}
		else
		{
			return $json['RGB'];
		}
	}

	/**
	 * 獲得縮略圖片地址
	 * @param $imageParam
	 * array('width' => 100,
	 *	'height' => 100,
	 *	'format' => '',
	 *	'crop_type' => 'Center',
	 *	'crop_width' => '',
	 *	'crop_height' => '',
	 *	'rotate' => '',
	 *	'blur' => '3x5',
	 *	'mark_url' => '',
	 *	'mark_type' => '',
	 *	'mark_dissolve' => '')
	 * 參數說明:
	 * width,height	當某一項爲0時,以另外一個爲主
	 * format	指定輸出格式:空爲原圖格式,jpg,gif,png,webp
	 * crop_type	是否進行裁剪,若是要進行裁剪,則width和height不能爲0
	 * crop_type取值:
	 * NorthWest	|	North	|	NorthEast
	 * West		|	Center	|	East
	 * SouthWest	|	South	|	SouthEast
	 *
	 * crop_width,crop_height	當須要進行裁剪時,必需填寫此兩個值
	 * rotate	旋轉,取值:1-360
	 * blur		高斯模糊,取值:1-50
	 */
	public static function getImageZoomUrl($scope, $key, $imageParam = array(), $private = false, $extTime = 43200)
	{
		$url = 'http://' . $scope . '.qiniudn.com/' . $key . '?imageMogr2/auto-orient/strip/thumbnail';

		if(isset($imageParam['width']) && !empty($imageParam['width']))
		{
			//正比例縮放
			$url .= '/' . $imageParam['width'] . 'x';
		}

		if(isset($imageParam['height']) && !empty($imageParam['height']))
		{
			//正比例縮放
			if(substr($url, strlen($url) - 1, 1) == 'x')
			{
				$url .= $imageParam['height'];
			}
			else
			{
				$url .= '/x' . $imageParam['height'];
			}
		}

		if(isset($imageParam['format']) && !empty($imageParam['format']))
		{
			//設置輸出格式
			$url .= '/format/' . $imageParam['format'];

			//若是輸出爲jpg格式,則設置漸進顯示模式
			if($imageParam['format'] == 'jpg')
			{
				$url .= '/interlace/1';
			}
		}

		if(isset($imageParam['rotate']) && !empty($imageParam['rotate']))
		{
			//設置旋轉
			$url .= '/rotate/' . $imageParam['rotate'];
		}

		if(isset($imageParam['blur']) && !empty($imageParam['blur']))
		{
			//設置模糊
			$url .= '/blur/' . $imageParam['blur'];
		}

		if(isset($imageParam['crop_type']) && !empty($imageParam['crop_type']))
		{
			//設置裁剪模式
			$url .= '/gravity/' . $imageParam['crop_type'] . '/crop';

			if(isset($imageParam['crop_width']) && !empty($imageParam['crop_width']))
			{
				//正比例縮放
				$url .= '/' . $imageParam['crop_width'] . 'x';
			}

			if(isset($imageParam['crop_height']) && !empty($imageParam['crop_height']))
			{
				//正比例縮放
				if(substr($url, strlen($url) - 1, 1) == 'x')
				{
					$url .= $imageParam['crop_height'];
				}
				else
				{
					$url .= '/x' . $imageParam['crop_height'];
				}
			}
		}

		if(isset($imageParam['mark_url']) && !empty($imageParam['mark_url']))
		{
			//打水印
			$url .= '|watermark/1/image/' . self::safeBase64Encode($imageParam['mark_url']);

			if(isset($imageParam['mark_dissolve']) && !empty($imageParam['mark_dissolve']))
			{
				//透明度
				$url .= '/dissolve/' . $imageParam['mark_dissolve'];
			}

			if(isset($imageParam['mark_type']) && !empty($imageParam['mark_type']))
			{
				//水印位置
				$url .= '/gravity/' . $imageParam['mark_type'];
			}
		}

		if($private)
		{
			$url .= '&' . self::getDownloadToken($url, $extTime);
		}

		return $url;
	}

	/**
	 * 獲得連接
	 */
	public static function getUrl($scope, $key, $private = false, $extTime = 43200)
	{
		$url = 'http://' . $scope . '.qiniudn.com/' . $key;
		if($private)
		{
			$url .= '?' . self::getDownloadToken($url, $extTime);
		}

		return $url;
	}

	/**
	 * 抓取資源
	 */
	public static function fetchUrl($scope, $key, $url)
	{
		$fileName = self::safeBase64Encode($scope . ':' . $key);
		$fetchUrl = self::safeBase64Encode($url);
		$url = 'http://iovip.qbox.me/fetch/' . $fetchUrl . '/to/' . $fileName;

		$accessToken = self::getAccessToken($url);

		$header = array();
		$header[] = 'Authorization: QBox ' . $accessToken;

		$html = Http::request(array('url' => $url, 'httpheader' => $header, 'timeout' => 60));
		$json = json_decode($html['html'], true);
		if(empty($json))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 刪除資源
	 */
	public static function delKey($scope, $key)
	{
		$fileName = self::safeBase64Encode($scope . ':' . $key);

		$url = 'http://rs.qiniu.com/delete/' . $fileName;

		$accessToken = self::getAccessToken($url);

		$header = array();
		$header[] = 'Authorization: QBox ' . $accessToken;

		$html = Http::request(array('url' => $url, 'httpheader' => $header, 'timeout' => 60));
		$json = json_decode($html['html'], true);
		if(empty($json))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 移動資源
	 */
	public static function moveKey($scopeSrc, $keySrc, $scopeDest, $keyDest)
	{
		$keySrc = self::safeBase64Encode($scopeSrc . ':' . $keySrc);
		$keyDest = self::safeBase64Encode($scopeDest . ':' . $keyDest);

		$url = 'http://rs.qiniu.com/move/' . $keySrc . '/' . $keyDest;

		$accessToken = self::getAccessToken($url);

		$header = array();
		$header[] = 'Authorization: QBox ' . $accessToken;

		$html = Http::request(array('url' => $url, 'httpheader' => $header, 'timeout' => 60));
		$json = json_decode($html['html'], true);
		if(empty($json))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 複製資源
	 */
	public static function copyKey($scopeSrc, $keySrc, $scopeDest, $keyDest)
	{
		$keySrc = self::safeBase64Encode($scopeSrc . ':' . $keySrc);
		$keyDest = self::safeBase64Encode($scopeDest . ':' . $keyDest);

		$url = 'http://rs.qiniu.com/copy/' . $keySrc . '/' . $keyDest;

		$accessToken = self::getAccessToken($url);

		$header = array();
		$header[] = 'Authorization: QBox ' . $accessToken;

		$html = Http::request(array('url' => $url, 'httpheader' => $header, 'timeout' => 60));
		$json = json_decode($html['html'], true);
		if(empty($json))
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * 上傳文件(直傳)
	 */
	public static function uploadFile($scope, $key, $fileName, $extTime = 86400, $notifyUrl = '')
	{
		$data = array();
		if(empty($notifyUrl))
		{
			$data['token'] = self::getUploadFileToken($scope, $extTime);
		}
		else
		{
			$data['token'] = self::getUploadMediaToken($scope, $extTime, $notifyUrl);
		}
		$data['filename'] = basename($fileName);
		$data['file'] = '@' . $fileName;
		$data['key'] = $key;
		$data['upload_file'] = true;

		$html = Http::request(array('url' => 'http://up.qiniu.com', 'data' => $data, 'timeout' => 5 * 60));
		print_r($html);
		$json = json_decode($html['html'], true);
		if(empty($json['key']))
		{
			return array();
		}
		else
		{
			if(empty($notifyUrl))
			{
				$json['name'] = basename($fileName);
				return $json;
			}
			else
			{
				return array('persistentId' => $json['persistentId']);
			}
		}
	}

	/**
	 * 文件上傳(分片)
	 */
	public static function uploadFileSplit($scope, $key, $file, $extTime = 86400, $notifyUrl = '')
	{
		$fileSize = 0;
		$ctxInfo = array();

		$host = 'http://up.qiniu.com';

		$header = array();
		if(empty($notifyUrl))
		{
			$header[] = 'Authorization: UpToken ' . self::getUploadFileToken($scope, $extTime);
		}
		else
		{
			$header[] = 'Authorization: UpToken ' . self::getUploadMediaToken($scope, $extTime, $notifyUrl);
		}

		$fp = fopen($file, 'rb');
		while(!feof($fp))
		{
			$data = fread($fp, 4194304);	//4194304爲4M的字節數 4 * 1024 * 1024

			$fileSize += strlen($data);

			$url = $host . '/mkblk/' . strlen($data);
			$html = Http::request(array('url' => $url, 'data' => $data, 'timeout' => 5 * 60, 'httpheader' => $header));
			$json = json_decode($html['html'], true);
			if(empty($json['crc32']))
			{
				return array();
			}
			else
			{
				$ctxInfo[] = $json['ctx'];
				$host = $json['host'];
			}
		}

		$ctxData = implode(',', $ctxInfo);

		$url = $host . '/mkfile/' . $fileSize . '/key/' . self::safeBase64Encode($key);
		$html = Http::request(array('url' => $url, 'data' => $ctxData, 'timeout' => 5 * 60, 'httpheader' => $header));
		$json = json_decode($html['html'], true);
		if(empty($json['key']))
		{
			return array();
		}
		else
		{
			if(empty($notifyUrl))
			{
				return $json;
			}
			else
			{
				return array('persistentId' => $json['persistentId']);
			}
		}
	}
}
?>
相關文章
相關標籤/搜索