123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521 |
- <?php
- /**
- * 七牛处理驱动
- *
- * @author widuu <admin@widuu.com>
- * @document https://github.com/widuu/qiniu_ueditor_1.4.3
- */
- class QiniuDriver{
- private $qiniu_rsf_host = 'http://rsf.qbox.me';
- private $qiniu_rs_host = 'http://rs.qbox.me';
- private $qiniu_up_host = 'http://up.qiniu.com';
- private $qiniu_io_host = 'http://iovip.qbox.me';
- private $status_code = '';
- public function __construct($config){
- foreach ($config as $k => $v) {
- $this->$k = $v;
- }
- }
- /**
- * 用于直传的时候获取token的方法
- *
- * @author widuu <admin@widuu.com>
- */
- public function getToken(){
- $token = $this->getUploadToken($_POST['key']);
- return array(
- 'state' => 'SUCCESS',
- 'token' => $token
- );
- }
- /**
- * 七牛删除文件方法
- *
- * @author widuu <admin@widuu.com>
- */
- public function removeFile($file){
- $file = trim($this->escapeQuotes($file));
- $scope = $this->SafeBase64Encode("{$this->bucket}:{$file}");
- $url = $this->qiniu_rs_host . "/delete/" . $scope;
- $token = $this->getSign("/delete/".$scope."\n");
- $response = $this->request($url, 'POST', array('Authorization'=>"QBox $token"));
- if( isset($response['error']) ){
- return array( 'code'=> 1 ,'error' => $response['error'] );
- }
- return array( 'code'=> 0 );
- }
- /**
- * 七牛远程获取文件
- * @param string $image_url 抓取的url
- * @param array $ue_config ueditor 配置信息
- * @return array
- * @author widuu <admin@widuu.com>
- */
- public function fetchFile( $image_url,$ue_config ){
- //重组第三方拉取URL
- $io_host = $this->uploadQiniuUrl;
- $io_host = str_replace("qiniu.com", "qbox.me", $io_host);
- $io_host = str_replace("up", "iovip", $io_host);
- // 要抓取的URL
- $image_url = trim($image_url);
- // 解析Url中的Path然后根据Path获取文件名称
- $file_path = parse_url($image_url,PHP_URL_PATH);
- // 获取存储文件名的field_name
- $field_name = pathinfo($file_path,PATHINFO_FILENAME).'.'.pathinfo($file_path,PATHINFO_EXTENSION);
- // 文件名称
- $file_name = $this->getFileName($field_name,$ue_config,true);
- // 七牛抓取存储文件的 EncodedEntryURI
- $encoded_entry_uri = $this->SafeBase64Encode("{$this->bucket}:{$file_name}");
- // 七牛抓取存储文件的 EncodedURL
- $encoded_uri = $this->SafeBase64Encode($image_url);
- // 七牛POST的PATH地址
- $post_path = "/fetch/". $encoded_uri ."/to/". $encoded_entry_uri;
- // POST URL
- $url = $io_host . $post_path;
- // 抓取Token
- $token = $this->getSign($post_path."\n");
- // 返回数据
- $response = $this->request($url, 'POST', array('Authorization'=>"QBox $token"));
- // 如果有错误信息
- if( !empty($response['error']) ){
- return array(
- 'state' => $response['error'],
- "url" => $image_url,
- );
- }
- // 拼接上传到七牛的地址
- $url = trim($this->host , "/" ). "/" . trim($response['key'], "/" );
- // 返回抓取结果
- return array(
- "state" => "SUCCESS",
- "url" => $url,
- "size" => $response['fsize'],
- );
- }
-
- /**
- * 七牛合成文件的方法
- * @param array 合成文件信息
- * @return array
- * @author widuu <admin@widuu.com>
- */
- public function Synthesis( $params = array(),$ue_config ){
- $ctx_list = rtrim($_POST['ctx'],",");
- $file_type = trim($_POST['type']);
- $file_size = trim($_POST['size']);
- $field_name = trim($_POST['name']);
- $upload_url = trim($_POST['host']);
- $file_name = $this->getFileName($field_name,$ue_config,true);
- $path = '/mkfile/'.intval($file_size).'/key/'.$this->SafeBase64Encode($file_name);
- $path .= '/mimeType/'.$this->SafeBase64Encode($file_type);
- $headers = array(
- 'Content-Type' => "text/plain",
- 'Authorization' => "UpToken ".$this->getUploadToken($file_name),
- );
- $response = $this->request($upload_url.$path, 'POST', $headers, $ctx_list);
-
- return array(
- "state" => $response['state'],
- "url" => $response['url'],
- "type" => $_POST['type'],
- "size" => $response['size'],
- "original" => $_POST['name']
- );
-
- }
- /**
- * 设置上传信息
- *
- * @param array $config ueditor php配置信息
- * @param array $ue_config ueditor json配置信息
- * @return array
- * @author widuu <admin@widuu.com>
- */
- public function getFileInfo( $config ,$ue_config ){
- $file_info = $this->setUploadInfo($config, $ue_config );
- $result = $this->uploadFile($file_info,$ue_config);
- // 如果有错误信息
- if( !empty($result['error']) ){
- return array(
- 'state' => $result['error']
- );
- }
- // 返回上传信息
- $field_name = $config['fieldName'];
- return array(
- "state" => "SUCCESS",
- "url" => $result['url'],
- "title" => $result['name'],
- "original" => $_FILES[$field_name]['name'],
- "type" => $_FILES[$field_name]['type'],
- "size" => $_FILES[$field_name]['size'],
- );
- }
- /**
- * 七牛列出文件列表
- *
- * @param prefix 前缀
- * @param marker 标记
- * @param limit 限制出现的个数
- * @author widuu <admin@widuu.com>
- */
- public function getList( $prefix, $marker, $limit){
- $request_info = $this->getListRequestInfo( $prefix, $marker, $limit );
- $request_url = $request_info['path'];
- $request_token = $request_info['token'];
- $response = $this->request($request_url, 'POST', array('Authorization'=>"QBox {$request_token}"));
- return $response;
- }
- /**
- * 设置上传信息
- *
- * @param array $config ueditor php配置信息
- * @param array $ue_config ueditor json配置信息
- * @return array
- * @author widuu <admin@widuu.com>
- */
- public function setUploadInfo( $config, $ue_config ){
- $field_name = $config['fieldName'];
- $file_name = $this->getFileName($field_name,$ue_config);
- $upload_info = array(
- "name" => 'file',
- 'file_name' => $file_name,
- 'file_body' => file_get_contents($_FILES[$field_name]['tmp_name'])
- );
- if( $config['base64'] == "base64" ){
- $upload_info['file_name'] = $file_name.'png';
- $upload_info['file_body'] = base64_decode( $_POST[$field_name] );
- }
- return $upload_info;
- }
- /**
- * 获取文件名称
- *
- * @param string $field_name 文件的filedname或者远程url地址
- * @param array $ue_config ueditor json配置信息
- * @param array $flag false 上传文件|true 远程抓取
- * @return string
- * @author widuu <admin@widuu.com>
- */
- public function getFileName( $field_name ,$ue_config , $flag = false ){
- $prefix = trim($ue_config['qiniuUploadPath'] , "/" ) . "/" ;
- $format = $ue_config['qiniuDatePath'];
- $time = explode('-', date("Y-y-m-d",time()));
- $file_name = "";
- if( !empty($format) ){
- if( strpos($format, 'y') !== false ){
- $format = str_replace("yyyy", $time[0], $format);
- $format = str_replace("yy" , $time[1], $format);
- }
- $format = str_replace("mm", $time[2], $format);
- $format = str_replace("dd", $time[3], $format);
-
- }
- if( isset($this->save_type) && trim($this->save_type) == 'date' ){
- // 不是远程抓取的时候
- if( !$flag ){
- $save_name = pathinfo($_FILES[$field_name]["name"], PATHINFO_EXTENSION);
- }else{
- $save_name = pathinfo($field_name, PATHINFO_EXTENSION);
- }
- $file_name = $prefix . $format.'/'.time().mt_rand(0,10).'.'.$save_name;
- }else{
- // 不是远程抓取
- if( !$flag ){
- $save_name = $_FILES[$field_name]["name"];
- }else{
- $file_name = $field_name;
- }
- $file_name = $prefix . $format . '/' . $save_name;
- }
- return $file_name;
- }
- /**
- * 上传文件到七牛的方法
- *
- * @param array $upload_info 上传文件信息
- * @return array
- * @author widuu <admin@widuu.com>
- */
- public function uploadFile( $upload_info,$ue_config ){
- $token = $this->getUploadToken($upload_info['file_name']);
- $mimeBoundary = md5(microtime());
- $header = array('Content-Type'=>'multipart/form-data;boundary='.$mimeBoundary);
- $data = array();
- $fields = array(
- 'token' => $token,
- 'key' => $upload_info['file_name'],
- );
- foreach ($fields as $name => $val) {
- array_push($data, '--' . $mimeBoundary);
- array_push($data, "Content-Disposition: form-data; name=\"$name\"");
- array_push($data, '');
- array_push($data, $val);
- }
- //文件
- array_push($data, '--' . $mimeBoundary);
- $name = $upload_info['name'];
- $fileName = $upload_info['file_name'];
- $fileBody = $upload_info['file_body'];
- $fileName = $this->escapeQuotes($fileName);
- array_push($data, "Content-Disposition: form-data; name=\"$name\"; filename=\"$fileName\"");
- array_push($data, 'Content-Type: application/octet-stream');
- array_push($data, '');
- array_push($data, $fileBody);
- array_push($data, '--' . $mimeBoundary . '--');
- array_push($data, '');
- $body = implode("\r\n", $data);
- $qiniuuphost = isset($this->uploadQiniuUrl) ? $this->uploadQiniuUrl : $this->qiniu_up_host;
- $response = $this->request($qiniuuphost, 'POST', $header, $body);
- return $response;
- }
- /**
- * 设置七牛列出文件的请求信息
- *
- * @param string $prefix 前缀
- * @param string $marker 标记
- * @param int $limit 限制出现的个数
- * @author widuu <admin@widuu.com>
- */
- private function getListRequestInfo($prefix='', $marker='', $limit = 0){
-
- $query = array( 'bucket' => $this->bucket );
-
- if (!empty($prefix)) {
- $query['prefix'] = $prefix;
- }
- if (!empty($marker)) {
- $query['marker'] = $marker;
- }
- if (!empty($limit)) {
- $query['limit'] = $limit;
- }
- $url = '/list?' . http_build_query($query);
- return array(
- 'path' => $this->qiniu_rsf_host . $url,
- 'token' => $this->getSign($url."\n")
- );
- }
- /**
- * 七牛Sign方法
- *
- * @param string $sign_data 加密字符串
- * @author widuu <admin@widuu.com>
- */
- private function getSign( $sign_data ){
- $sign = hash_hmac('sha1',$sign_data, $this->secret_key, true);
- $result = $this->access_key . ':' . $this->SafeBase64Encode($sign);
- return $result;
- }
- /**
- * 直传水印url拼接方式
- *
- * @author widuu <admin@widuu.com>
- */
- private function getDirectReturnBody(){
- //使用水印和非使用水印拼接方法
- if( !$this->use_water ){
- $url = trim($this->host , "/")."/$(key)";
- }else{
- $water_image = $this->SafeBase64Encode($this->water_url);
- $url = trim($this->host , "/")."/$(key)?watermark/1/image/{$water_image}";
- $url .= "/dissolve/{$this->dissolve}/gravity/{$this->gravity}/dx/{$this->dx}/dy/{$this->dy}";
- }
-
- $return_body = array(
- "url" => $url,
- "state" => "SUCCESS",
- "name" => "$(fname)",
- "size" => "$(fsize)",
- "w" => "$(imageInfo.width)",
- "h" => "$(imageInfo.height)",
- );
- return json_encode($return_body);
- }
- /**
- * 七牛base64方法
- *
- * @param string $infomation base64的字符串
- * @author widuu <admin@widuu.com>
- */
- private function SafeBase64Encode( $infomation ){
- $find = array('+', '/');
- $replace = array('-', '_');
- return str_replace($find, $replace, base64_encode($infomation));
- }
- /**
- * 获取上传的文件token
- *
- * @param string $key 文件名称
- * @return string
- * @author widuu <admin@widuu.com>
- */
- private function getUploadToken($key){
- $time = time() + $this->timeout;
- $scope = $this->bucket.":".$this->escapeQuotes($key);
- $put_policy = array(
- 'returnBody' => $this->getDirectReturnBody(),
- 'deadline' => $time,
- 'scope' => $scope
- );
- $safe_data = $this->SafeBase64Encode(json_encode($put_policy));
- return $this->getSign($safe_data).':'.$safe_data;
- }
- /**
- * 请求云服务器
- * @param string $path 请求的PATH
- * @param string $method 请求方法
- * @param array $headers 请求header
- * @param resource $body 上传文件资源
- * @return boolean
- */
- private function request($path, $method, $headers = null, $body = null){
- $ch = curl_init($path);
- $_headers = array('Expect:');
- if (!is_null($headers) && is_array($headers)){
- foreach($headers as $k => $v) {
- array_push($_headers, "{$k}: {$v}");
- }
- }
- $length = 0;
- $date = gmdate('D, d M Y H:i:s \G\M\T');
- if (!is_null($body)) {
- if(is_resource($body)){
- fseek($body, 0, SEEK_END);
- $length = ftell($body);
- fseek($body, 0);
- array_push($_headers, "Content-Length: {$length}");
- curl_setopt($ch, CURLOPT_INFILE, $body);
- curl_setopt($ch, CURLOPT_INFILESIZE, $length);
- } else {
- $length = @strlen($body);
- array_push($_headers, "Content-Length: {$length}");
- curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
- }
- } else {
- array_push($_headers, "Content-Length: {$length}");
- }
- array_push($_headers, "Date: {$date}");
- curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers);
- curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
- curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
- if ($method == 'PUT' || $method == 'POST') {
- curl_setopt($ch, CURLOPT_POST, 1);
- } else {
- curl_setopt($ch, CURLOPT_POST, 0);
- }
- if ($method == 'HEAD') {
- curl_setopt($ch, CURLOPT_NOBODY, true);
- }
- $response = curl_exec($ch);
- if( !$response ){
- return false;
- }
- $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
- curl_close($ch);
- list($header, $body) = explode("\r\n\r\n", $response, 2);
- return $this->response($body);
- }
- /**
- * 获取响应数据
- * @param string $text 响应头字符串
- * @return array 响应数据列表
- */
- private function response($text){
- $headers = explode(PHP_EOL, $text);
- $items = array();
- foreach($headers as $header) {
- $header = trim($header);
- if(strpos($header, '{') !== False){
- $items = json_decode($header, 1);
- break;
- }
- }
- return $items;
- }
- /**
- * 特殊字符串处理
- * @param string $str
- * @author widuu <admin@widuu.com>
- */
- private function escapeQuotes($str){
- $find = array("\\", "\"");
- $replace = array("\\\\", "\\\"");
- return str_replace($find, $replace, $str);
- }
-
- }
|