又拍云提供了云处理的文档,其中包括视频音频剪辑、远程下载、在线压缩解压等,在国内云服务算是比较领先的了。

工作需要,恰好按照文档整理出一个php类,只有在线压缩解压和异步文件拉取(远程下载)。其它音频剪辑等没需求,就没去做。

代码还有一些优化空间,比如tasks和提交parameter格式,也许也可以单独从每个函数中拆封出来,但是不太清楚又拍云的每一个请求是不是格式都一样,看了下视频就有一些不一样,所以没有拆分。代码直接复制保存就可以用,其中的函数作用也备注出来了,小白估计都能理解。

少说废话,上代码:

<?php
    class upyun{

        public $operator_name;
        public $bucket_name;
        public $operator_password_md5;
        public $notify_url;

        public function __construct($bucket_name, $operator_name, $operator_password_md5, $notify_url){
            $this->operator_name            = $operator_name;
            $this->operator_password_md5    = $operator_password_md5;
            $this->notify_url               = $notify_url;
            $this->bucket_name              = $bucket_name;
        }

        /* 异步文件拉取 */
        public function spider($url, $save_as, $random=false, $overwrite=true){
            # tasks格式
            $tasks[] = array(
                'url'           => $url,
                'save_as'       => $save_as,
                'random'        => $random,
                'overwrite'     => $overwrite
            );
            $tasks  = base64_encode(json_encode($tasks));

            # 构成参数并签名
            $parameter = array(
                'bucket_name'       => $this->bucket_name,
                'notify_url'        => $this->notify_url,
                'tasks'             => $tasks,
                'app_name'          => 'spiderman',
            );

            # 构建Header
            $header     = array();
            $header[]   = $this->getAuthorization($this->operator_name, $this->operator_password_md5, $parameter);
            $return     = $this->request_by_curl('http://p0.api.upyun.com/pretreatment/', $parameter, $header);
            $return     = json_decode($return, true);
            return $return[0] != '' ? $return[0] : false;
        }

        /* 在线解压 */
        public function zip($sources, $save_as, $home_dir=''){
            $tasks[] = array(
                'sources'           => $sources,
                'save_as'           => $save_as,
                'home_dir'          => $home_dir
            );
            $tasks  = base64_encode(json_encode($tasks));
            $parameter = array(
                'bucket_name'       => $this->bucket_name,
                'notify_url'        => $this->notify_url,
                'tasks'             => $tasks,
                'app_name'          => 'compress',
            );
            $header     = array();
            $header[]   = $this->getAuthorization($this->operator_name, $this->operator_password_md5, $parameter);
            $return     = $this->request_by_curl('http://p0.api.upyun.com/pretreatment/', $parameter, $header);
            $return     = json_decode($return, true);
            return $return[0] != '' ? $return[0] : false;

        }

        /* 在线压缩 */
        public function unzip($sources, $save_as){
            $tasks[] = array(
                'sources'           => $sources,
                'save_as'           => $save_as
            );
            $tasks  = base64_encode(json_encode($tasks));
            $parameter = array(
                'bucket_name'       => $this->bucket_name,
                'notify_url'        => $this->notify_url,
                'tasks'             => $tasks,
                'app_name'          => 'depress',
            );
            $header     = array();
            $header[]   = $this->getAuthorization($this->operator_name, $this->operator_password_md5, $parameter);
            $return     = $this->request_by_curl('http://p0.api.upyun.com/pretreatment/', $parameter, $header);
            $return     = json_decode($return, true);
            return $return[0] != '' ? $return[0] : false;
        }

        /**     Private     **/

        /* 授权认证返回 */
        private function getAuthorization($operator_name,$operator_password_md5, $parameter){
            $parameter  = $this->SortedDictionary($parameter);
            $str        = '';
            foreach ($parameter as $k=>$v){
                $str .= $k.$v;
            }
            $signature = md5($operator_name.$str.$operator_password_md5);
            #Authorization: UPYUN <operator>:<signature>
            $str = 'Authorization: UPYUN '. $operator_name .':'.$signature;
            return $str;
        }

        /* 字典排序 */
        private function SortedDictionary($array){
            ksort($array);
            return $array;
        }

        /* 提交参数拼接 */
        private function UrlParameter($array){
            $arr = array();
            foreach($array as $k=>$v){
                $arr[] = $k.'='.$v;
            }
            $arr = implode('&',$arr);
            return $arr;
        }

        /* post请求 */
        private function request_by_curl($url,$parameter,$header){
            $post_string = $this->UrlParameter($parameter);
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL,$url);
            curl_setopt($ch, CURLOPT_POSTFIELDS,$post_string);
            curl_setopt($ch, CURLOPT_HEADER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    // https请求 不验证证书和hosts
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);  
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
            curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
            $data       = curl_exec($ch);
            $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
            $content    = substr($data, $headerSize);
            curl_close($ch);
            return $content;
        }

    }

?>