網(wǎng)站開發(fā)如何對(duì)接阿里云oss云存儲(chǔ)服務(wù)

2023-03-07    分類: 網(wǎng)站建設(shè)

一、為什么要用oss
將網(wǎng)站的靜態(tài)資源存儲(chǔ)在oss上,靜態(tài)資源包括網(wǎng)站圖片,html,js,css文件,通過(guò)cdn將靜態(tài)資源分布式緩存在各個(gè)節(jié)點(diǎn)上實(shí)現(xiàn)就就近訪問(wèn),提高用戶訪問(wèn)的響應(yīng)速度.
二、oss怎么用
1.在阿里云產(chǎn)品與服務(wù)找到-對(duì)象存儲(chǔ)oss

對(duì)象存儲(chǔ)OSS管理i

2.創(chuàng)建Bucket設(shè)置該讀寫權(quán)限(ACL)為公共讀

新建OSS BUCKET

3.在AccessKey 管理創(chuàng)建AccessKey

ACCESSKEY生成

三、創(chuàng)建上傳控制器
classAliossControllerextendsFwadminController{
private$oss_host='https://youboxunguanwang.oss-cn-shenzhen.aliyuncs.com';//'https://yifajian2020.oss-cn-beijing.aliyuncs.com';//阿里云oss外網(wǎng)地址endpoint
private$oss_key_id='';//阿里云ossAccessKeyID
private$oss_key_secret='';//阿里云ossAccessKeySecret
private$oss_bucket_name='';//創(chuàng)建的bucket名稱
private$oss_endpoint='oss-cn-shenzhen.aliyuncs.com';//阿里云OSS外網(wǎng)地址
/*
*獲得簽名
*@paramstring$path保存路徑
*@returnjson
*/
publicfunctionget_sign($path=''){
$now=time();
$expire=300000;//設(shè)置該policy超時(shí)時(shí)間是30s.即這個(gè)policy過(guò)了這個(gè)有效時(shí)間,將不能訪問(wèn)
$end=$now+$expire;
$expiration=$this->gmt_iso8601($end);
//大文件大小.用戶可以自己設(shè)置
$condition=array(0=>'content-length-range',1=>0,2=>10485760000);
$conditions[]=$condition;
//表示用戶上傳的數(shù)據(jù),必須是以$dir開始,不然上傳會(huì)失敗,這一步不是必須項(xiàng),只是為了安全起見(jiàn),防止用戶通過(guò)policy上傳到別人的目錄
$start=array(0=>'starts-with',1=>$this->oss_key_secret,2=>$path);
$conditions[]=$start;
$arr=array('expiration'=>$expiration,'conditions'=>$conditions);
//echojson_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;
//這個(gè)參數(shù)是設(shè)置用戶上傳指定的前綴
$response['dir']=$path;
echojson_encode($response);
return;
}
functiongmt_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";
}
}
上傳文件
/**
*上傳文件操作
*/
classAliossdControllerextendsFwadminController{
/*
public$ossconfig=array(
public$ossconfig=array(
'id'=>'',//AccessKeyID
'key'=>'',//AccessKeySecret
'bucketname'=>'xxxx',//bucket名稱
'host'=>'https://xxxx.oss-cn-beijing.aliyuncs.com',//上傳提交地址格式:bucketname+區(qū)別+阿里的域名
'expire'=>30,//過(guò)期時(shí)間
'callback_body'=>array(
'callbackUrl'=>'',//回調(diào)地址全地址含有參數(shù)
'callbackHost'=>'',//回調(diào)域名
'callbackBody'=>'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}',//阿里返回的圖片信息
'callbackBodyType'=>'application/x-www-form-urlencoded',//設(shè)置阿里返回的數(shù)據(jù)格式
),
'maxfilesize'=>10485760,//限制上傳文件大小這里是10M
'imghost'=>'https://xxxx.oss-cn-beijing.aliyuncs.com',//前臺(tái)顯示圖片的地址格式不多說(shuō)
);
publicfunction_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/';//初始化回調(diào)地址
$this->ossconfig['callback_body']['callbackHost']=$_SERVER['HTTP_HOST'];//初始化回調(diào)域名
}
//獲取policy和回調(diào)地址一般使用jajx或是在加載頁(yè)面的時(shí)候會(huì)用到policy和回調(diào)地址,還有傳限制大小等
publicfunctiongetpolicy(){
//過(guò)期時(shí)間不得不說(shuō)那個(gè)T和Z這個(gè)得注意(阿里demo的那個(gè)函數(shù)不知道就是使用不了,我這樣是可以使用的)
$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'));//這里要獲得上傳的路徑有一個(gè)參數(shù)path具體看uploadpath這個(gè)方法,根據(jù)項(xiàng)目自己設(shè)置
//這個(gè)就是policy
$policy=array(
'expiration'=>$expire,//過(guò)期時(shí)間
'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'自定義使用哪個(gè)參數(shù)來(lái)做上傳文件的名稱.
//而這個(gè)'$key'并不是一個(gè)值,只是告訴OSS服務(wù)器使用哪個(gè)參數(shù)來(lái)作為上傳文件的名稱
//注意是全路徑,比如前端上傳圖片的使用提交的地址中&key=upload/images/20160127${filename}
//那么在上傳圖片的時(shí)候就要拼接出key的路徑然后和圖片一起提交給oss服務(wù)器
//你上傳的圖片的名子是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)),//我這里使用時(shí)間和隨時(shí)數(shù)據(jù)作為上傳文件的名子
'maximgfilesize'=>307200,//前端JS判斷可以上傳的圖片的大小這里是300K
);
$this->ajaxReturn(array('status'=>0,'msg'=>'','config'=>$res),'json');
}
//回調(diào)處理方法這里使用OSSdemo里的東西,但demo里有個(gè)坑就是一定要告訴其內(nèi)容長(zhǎng)度content-lenght的值具體看_msg()方法
//這里面還有一些設(shè)置可以查看OSS接口說(shuō)明的地方,我這里沒(méi)有設(shè)置,可以獲到頭部的信息
publicfunctioncupload(){
$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.1403Forbidden");
$this->_msg(array("Status"=>"error",'msg'=>'上傳失敗,請(qǐng)重新上傳'));
}
//獲取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.1403Forbidden");
$this->_msg(array("Status"=>"error",'msg'=>'上傳失敗,請(qǐng)重新上傳'));
}
//獲取回調(diào)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;
}
//驗(yàn)證簽名
$ok=openssl_verify($authStr,$authorization,$pubKey,OPENSSL_ALGO_MD5);
if($ok==1){
//增加對(duì)上圖片的類型的判斷
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'=>'上傳圖片過(guò)大,無(wú)法上傳'));
}
$this->_msg(array("Status"=>"Ok",'msg'=>'','pic'=>$this->ossconfig['imghost'].I('filename')));
}else{
//header("http/1.1403Forbidden");
$this->_msg(array("Status"=>"error",'msg'=>'上傳失敗,請(qǐng)重新上傳'));
}
}
//返回要上傳的路徑注意這里的路徑最前最不要有/符號(hào),否則會(huì)出錯(cuò)
publicfunctionuploadpath($type){
switch($type){
case'1':
$patch='Upload/images/';
break;
}
return$patch;
}
publicfunctiongmt_iso8601($time){
$dtStr=date("c",$time);
$mydatetime=newDateTime($dtStr);
$expiration=$mydatetime->format(DateTime::ISO8601);
$pos=strpos($expiration,'+');
$expiration=substr($expiration,0,$pos);
return$expiration."Z";
}
publicfunction_msg($arr){
$data=json_encode($arr);
header("Content-Type:application/json");
header("Content-Length:".strlen($data));
exit($data);
}
//刪除圖片或文件信息這里有個(gè)坑就簽名算法這塊
//這個(gè)刪除是單一文件刪除,估計(jì)批量刪除可以就沒(méi)有問(wèn)題了
//單一圖片刪除使用delete所以傳遞的內(nèi)容為空,就不要使用md5加密
//然后刪除成功了,OSS服務(wù)不返回任務(wù)內(nèi)容坑
//還有就是地址這塊在算簽名的時(shí)候一定要加個(gè)bucketname這點(diǎn)最坑
publicfunctiondelosspic($picurl){
if(empty($picurl)){
returnarray('status'=>1,'msg'=>'要?jiǎng)h除的圖片不能為空');
}
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,dMYH:i:s").'GMT';//一定要使用http1.1標(biāo)準(zhǔn)時(shí)間格式
//簽名算法不多說(shuō)官網(wǎng)的例子也只能無(wú)語(yǔ),沒(méi)有PHP版的。本人這個(gè)可以使用驗(yàn)證通過(guò),可以正常刪除文件
$signature=base64_encode(hash_hmac('sha1',"DELETE\n\ntext/html\n".$gtime."\n".$picurl,$this->ossconfig['key'],true));
//傳遞頭這里也是坑上面使用了text/html靠,在協(xié)議頭里還得加上,要不然會(huì)提示出錯(cuò)。
$headers=array(
'Authorization:OSS'.$this->ossconfig['id'].':'.$signature,
'Date:'.$gtime,//靠時(shí)間也得帶上
'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刪除文件不返回結(jié)果,沒(méi)有返回結(jié)果就表示刪除成功,反之會(huì)有刪除出錯(cuò)信息
}
//測(cè)試刪除一個(gè)圖片文件
publicfunctiondel_file(){
$url=I('url');
$this->delosspic($url);
echo'1';
}
}
四、其他js 前端文件
https://pan.baidu.com/s/1P6nZ5iL_AR2U3nZpmfQ5AQ

網(wǎng)站標(biāo)題:網(wǎng)站開發(fā)如何對(duì)接阿里云oss云存儲(chǔ)服務(wù)
文章分享:http://www.bm7419.com/news47/242297.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、企業(yè)建站、做網(wǎng)站商城網(wǎng)站、網(wǎng)站建設(shè)、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)