<mark id="sc1zy"><output id="sc1zy"></output></mark>
<ruby id="sc1zy"></ruby><strong id="sc1zy"><u id="sc1zy"><dl id="sc1zy"></dl></u></strong>

    <optgroup id="sc1zy"><li id="sc1zy"></li></optgroup>

    1. 400-800-9385
      網站建設資訊詳細

      網站開發如何對接阿里云oss云存儲服務

      發表日期:2020-10-17 09:57:08   作者來源:劉紅旺   瀏覽:4105   標簽:oss云存儲    
      一、為什么要用oss

      將網站的靜態資源存儲在oss上,靜態資源包括網站圖片,html,js,css文件,通過cdn將靜態資源分布式緩存在各個節點上實現就就近訪問,提高用戶訪問的響應速度.

      二、oss怎么用

      1.在阿里云產品與服務找到-對象存儲oss
       

      對象存儲OSS管理i


       
      2.創建Bucket設置該讀寫權限(ACL)為 公共讀
       

      新建OSS BUCKET


       
      3.在AccessKey 管理創建AccessKey
       
       

      新建密鑰
      ACCESSKEY生成

       
       
      三、創建上傳控制器
      class AliossController extends FwadminController {
       
          private $oss_host = 'https://youboxunguanwang.oss-cn-shenzhen.aliyuncs.com';//'https://yifajian2020.oss-cn-beijing.aliyuncs.com';//阿里云oss 外網地址endpoint
          private $oss_key_id = '';//阿里云oss Access Key ID
          private $oss_key_secret = '';//阿里云oss Access Key Secret
          private $oss_bucket_name = '';//創建的bucket名稱
          private $oss_endpoint = 'oss-cn-shenzhen.aliyuncs.com';//阿里云OSS外網地址
         /*
          
           * 獲得簽名
           * @param string $path 保存路徑
           * @return json
           */
          public function get_sign($path = '') {     
              $now = time();
              $expire = 300000; //設置該policy超時時間是30s. 即這個policy過了這個有效時間,將不能訪問
              $end = $now + $expire;
              $expiration = $this->gmt_iso8601($end);
              
              //最大文件大小.用戶可以自己設置
              $condition = array(0=>'content-length-range', 1=>0, 2=>10485760000);
              $conditions[] = $condition;
              //表示用戶上傳的數據,必須是以$dir開始, 不然上傳會失敗,這一步不是必須項,只是為了安全起見,防止用戶通過policy上傳到別人的目錄
              $start = array(0=>'starts-with', 1=>$this->oss_key_secret, 2=>$path);
              $conditions[] = $start;
              
              $arr = array('expiration'=>$expiration,'conditions'=>$conditions);
              //echo json_encode($arr);
              //return;
              $policy = json_encode($arr);
              $base64_policy = base64_encode($policy);
              $string_to_sign = $base64_policy;
              $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $this->oss_key_secret, true));
       
              $response = array();
              $response['accessid'] = $this->oss_key_id;
              $response['host'] = $this->oss_host;
              $response['policy'] = $base64_policy;
              $response['signature'] = $signature;
              $response['expire'] = $end;
              //這個參數是設置用戶上傳指定的前綴
              $response['dir'] = $path;
            
              echo json_encode($response);
              return ;
          }


         
          function gmt_iso8601($time) {
              $dtStr = date("c", $time);
              $mydatetime = new \DateTime($dtStr);
              $expiration = $mydatetime->format(\DateTime::ISO8601);
              $pos = strpos($expiration, '+');
              $expiration2 = substr($expiration, 0, $pos);
              return $expiration2."Z";
          }
          
          
      }
       
      上傳文件
      /**
       * 上傳文件操作
       */
      class AliossdController extends FwadminController {
        /*
      public $ossconfig = array(
      public $ossconfig = array(
      'id'=>'',//Access Key ID
      'key'=>'', //Access Key Secret
      'bucketname'=>'xxxx', //bucket名稱
      'host'=>'https://xxxx.oss-cn-beijing.aliyuncs.com', //上傳提交地址 格式:bucketname+區別+阿里的域名
      'expire' => 30, //過期時間
      'callback_body' => array(
      'callbackUrl'=>'', //回調地址全地址含有參數
      'callbackHost'=>'', //回調域名
      'callbackBody'=>'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}', //阿里返回的圖片信息
      'callbackBodyType'=>'application/x-www-form-urlencoded', //設置阿里返回的數據格式
       ),
      'maxfilesize'=>10485760, //限制上傳文件大小 這里是10M
      'imghost' =>'https://xxxx.oss-cn-beijing.aliyuncs.com', //前臺顯示圖片的地址 格式不多說
          );



      public function _initialize() {
      $this->ossconfig['host']= 'https://'.$this->ossconfig['bucketname'].'.oss-cn-beijing.aliyuncs.com'; //初始化上傳地址
      $this->ossconfig['callback_body']['callbackUrl']='https://'.$_SERVER['HTTP_HOST'].'/s****n.php/ossupload/cupload/'; //初始化回調地址
      $this->ossconfig['callback_body']['callbackHost']=$_SERVER['HTTP_HOST']; //初始化回調域名
      }
      //獲取policy和回調地址 一般使用jajx或是在加載頁面的時候會用到policy和回調地址,還有傳限制大小等
      public function getpolicy(){
      //過期時間 不得不說那個T和Z這個得注意(阿里demo的那個函數不知道就是使用不了,我這樣是可以使用的)
      $expire = $this->ossconfig['expire']+time();
      $expire = date('Y-m-d').'T'.date('H:i:s').'Z';
      //$expiration = $this->gmt_iso8601($expire);
      //獲取上傳的路徑
      $dir = $this->uploadpath(I('path')); //這里要獲得上傳的路徑有一個參數path 具體看uploadpath這個方法,根據項目自己設置
      //這個就是policy
      $policy = array(
      'expiration' =>$expire, //過期時間
      'conditions' =>array(
      0=>array(0=>'content-length-range', 1=>0, 2=>$this->ossconfig['maxfilesize']), //限制上傳文件的大小
      1=>array(0=>'starts-with', 1=>'$key', 2=>$dir), //這里的'$key' 一定要注意
      ),
      );
      //上面的'$key' 自定義使用哪個參數來做上傳文件的名稱.
      //而這個'$key'并不是一個值,只是告訴OSS服務器使用哪個參數來作為上傳文件的名稱
      //注意是全路徑,比如前端上傳圖片的使用提交的地址中&key=upload/images/20160127${filename}
      //那么在上傳圖片的時候就要拼接出key的路徑然后和圖片一起提交給oss服務器
      //你上傳的圖片的名子是5566.png ,那么保存在oss的圖片路徑 就是upload/images/201601275566.png;
      //而后面的$dir 就是upload/images/
      $policy = base64_encode(json_encode($policy));
      $signature = base64_encode(hash_hmac('sha1', $policy, $this->ossconfig['key'], true)); //簽名算法
      $res = array(
      'accessid'=>$this->ossconfig['id'],
      'host' =>$this->ossconfig['host'],
      'policy' => $policy,
      'signature'=>$signature,
      'expire' =>$expire,
      'callback' =>base64_encode(json_encode($this->ossconfig['callback_body'])),
      'dir'  =>$dir,
      'filename' =>md5(date('YmdHis').rand(1000,9999)), //我這里使用時間和隨時數據作為上傳文件的名子
      'maximgfilesize'=>307200, //前端JS判斷 可以上傳的圖片的大小 這里是300K
              );
      $this->ajaxReturn(array('status'=>0, 'msg'=>'', 'config'=>$res),'json');
      }
      //回調處理方法 這里使用OSS demo里的東西,但demo里有個坑就是一定要告訴其內容長度 content-lenght的值具體看 _msg()方法
      //這里面還有一些設置可以查看OSS接口說明的地方,我這里沒有設置,可以獲到頭部的信息
      public function cupload(){
      $authorizationBase64 = '';
      $pubKeyUrlBase64 = '';
      if(isset($_SERVER['HTTP_AUTHORIZATION'])){
      $authorizationBase64 = $_SERVER['HTTP_AUTHORIZATION'];
      }
      if (isset($_SERVER['HTTP_X_OSS_PUB_KEY_URL'])){
      $pubKeyUrlBase64 = $_SERVER['HTTP_X_OSS_PUB_KEY_URL'];
      }
      if ($authorizationBase64 == '' || $pubKeyUrlBase64 == ''){
      //header("http/1.1 403 Forbidden");
      $this->_msg(array("Status"=>"error",'msg'=>'上傳失敗,請重新上傳'));
      }
      //獲取OSS的簽名
      $authorization = base64_decode($authorizationBase64);
      //獲取公鑰
      $pubKeyUrl = base64_decode($pubKeyUrlBase64);
      $ch = curl_init();
              curl_setopt($ch, CURLOPT_URL, $pubKeyUrl);
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
              curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
      $pubKey = curl_exec($ch);
      if ($pubKey == ""){
      //header("http/1.1 403 Forbidden");
      $this->_msg(array("Status"=>"error",'msg'=>'上傳失敗,請重新上傳'));
      }
      //獲取回調body
      $body = file_get_contents('php://input');
      //拼接待簽名字符串
      $authStr = '';
      $path = $_SERVER['REQUEST_URI'];
      $pos = strpos($path, '?');
      if ($pos === false){
      $authStr = urldecode($path)."\n".$body;
      }else{
      $authStr = urldecode(substr($path, 0, $pos)).substr($path, $pos, strlen($path) - $pos)."\n".$body;
      }
      //驗證簽名
      $ok = openssl_verify($authStr, $authorization, $pubKey, OPENSSL_ALGO_MD5);
      if ($ok == 1){
      //增加對上圖片的類型的判斷
      if(!in_array(I('mimeType'), array('image/png', 'image/gif', 'image/jpeg'))){
      $this->_msg(array("Status"=>"error",'msg'=>'不支持的文件類型'));
      }
      //if(I('size')>$this->ossconfig['maxfilesize']){
      if(I('size')>512000){
      $this->_msg(array("Status"=>"error",'msg'=>'上傳圖片過大,無法上傳'));
      }
      $this->_msg(array("Status"=>"Ok",'msg'=>'','pic'=>$this->ossconfig['imghost'].I('filename')));
      }else{
      //header("http/1.1 403 Forbidden");
      $this->_msg(array("Status"=>"error",'msg'=>'上傳失敗,請重新上傳'));
      }
      }
      //返回要上傳的路徑 注意這里的路徑 最前最不要有/符號,否則會出錯
      public function uploadpath($type){
      switch ($type) {
      case '1':
      $patch = 'Upload/images/';
      break;
      }
      return $patch;
      }
       
      public function gmt_iso8601($time) {
      $dtStr = date("c", $time);
      $mydatetime = new DateTime($dtStr);
      $expiration = $mydatetime->format(DateTime::ISO8601);
      $pos = strpos($expiration, '+');
      $expiration = substr($expiration, 0, $pos);
      return $expiration."Z";
      }
      public function _msg($arr){
      $data = json_encode($arr);
      header("Content-Type: application/json");
      header("Content-Length: ".strlen($data));
      exit($data);
      }
      //刪除圖片或文件信息 這里有個坑就簽名算法這塊
      //這個刪除是單一文件刪除,估計批量刪除可以就沒有問題了
      //單一圖片刪除使用delete 所以傳遞的內容為空,就不要使用md5加密
      //然后刪除成功了,OSS服務不返回任務內容 坑
      //還有就是地址這塊在算簽名的時候一定要加個bucketname這點最坑
      public function delosspic($picurl){
      if(empty($picurl)){
      return array('status'=>1, 'msg'=>'要刪除的圖片不能為空');
      }
      if(strpos($picurl, $this->ossconfig['host'])===false)
      {
      $picurl = trim($picurl,'/');
       $url = $this->ossconfig['host'].'/'.$picurl;
       $picurl = '/'.$this->ossconfig['bucketname'].'/'.$picurl;
       }
      else{
      $url = $picurl;
      $picurl = str_replace($this->ossconfig['host'], '', $picurl);
      $picurl = trim($picurl, '/');
      $picurl = '/'.$this->ossconfig['bucketname'].'/'.$picurl;
      }
        $url = str_replace('https', 'http', $url);
        
       
      $gtime = gmdate("D, d M Y H:i:s").' GMT'; //一定要使用 http 1.1 標準時間格式
      //簽名算法不多說官網的例子也只能無語,沒有PHP版的。本人這個可以使用驗證通過,可以正常刪除文件
      $signature = base64_encode(hash_hmac('sha1',"DELETE\n\ntext/html\n".$gtime."\n".$picurl, $this->ossconfig['key'], true));
       
      //傳遞頭這里也是坑 上面使用了 text/html靠,在協議頭里還得加上,要不然會提示出錯。
      $headers = array(
      'Authorization: OSS '.$this->ossconfig['id'].':'.$signature,
      'Date:'.$gtime, //靠時間也得帶上
      'Content-Type: text/html', //傳遞類型要與上面簽名算法一致
       );
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      //curl_setopt($ch, CURLOPT_HEADER, 1);
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
      curl_exec($ch);
      //靠,OSS刪除文件不返回結果,沒有返回結果就表示刪除成功,反之會有刪除出錯信息
      }
      //測試刪除一個圖片文件
         public function del_file(){
         $url = I('url');
           $this->delosspic($url);
         echo '1';
         }
      }
       
      四、其他js 前端文件
      https://pan.baidu.com/s/1P6nZ5iL_AR2U3nZpmfQ5AQ
      提取碼:ege2
      如沒特殊注明,文章均為方維網絡原創,轉載請注明來自http://www.carlodifabbio.com/news/5871.html
      秋霞鲁丝片AV无码少妇,强奷漂亮少妇高潮A片久久,日本丰满少妇BBBBBB,无码少妇一区二区浪潮免费