概念理解
阿里有一套自己的相關(guān)概念,既然要用人家的產(chǎn)品,就要按照人家的要求來(lái)。
Bucket存儲(chǔ)空間
Object需要存儲(chǔ)的對(duì)象
Region地域
Endpoint訪問(wèn)域名
Region和Endpoint要相對(duì)應(yīng),杭州 Region 的外網(wǎng) Endpoint 是 oss-cn-hangzhou.aliyuncs.com,內(nèi)網(wǎng) Endpoint 是 oss-cn-hangzhou-internal.aliyuncs.com。這個(gè)在阿里文檔中也有解釋。
AccessKeyId和AccessKeySecret是加密解密及身份標(biāo)識(shí)所需數(shù)據(jù),每個(gè)賬號(hào)都有,自己去控制臺(tái)翻翻。
拿到這幾個(gè)數(shù)據(jù)后,再下載阿里oss對(duì)象存儲(chǔ)sdk,就可以進(jìn)行代碼編寫(xiě)操作了。
不過(guò)在這之前還是要做幾步簡(jiǎn)單操作
1 去管理控制臺(tái)創(chuàng)建一個(gè)存儲(chǔ)空間bucket,一般選標(biāo)準(zhǔn)存儲(chǔ)類型,權(quán)限選公共讀,私有寫(xiě)。
2 設(shè)置跨域規(guī)則如下圖,有特殊要求具體處理。
代碼部分
相應(yīng)類
<?php
namespacePFinal\Storage;
useOSS\Core\OssException;
useOSS\OssClient;
classAliOss
{
protected$id;
protected$secret;
protected$endpoint;
protected$bucket;
protected$maxSize=5;//單位G 阿里單次上傳文件限制
public$message;
protected$fileName;
public function__construct(array$config=array())
{
foreach($configas$key=>$item){
$this->$key=$item;
}
}
/**
* 上傳文件
*
*@paramobject $file
*@paramstring $key
*@returnbool
*/
public functionput($file,$key)
{
// 允許上傳文件大小 (G)
$maxSize=$this->maxSize;
//檢查文件大小
if($file->getClientSize()>$maxSize*1024*1024*1020){
$this->error='文件大小不能超過(guò)'.$maxSize.'G';
return false;
}
//本地臨時(shí)文件
$tempPath=$file->getPathName();
//原擴(kuò)展
$originalExtension=$file->getClientOriginalExtension();
//新文件名
$newName=$key. uniqid().'.'.$originalExtension;
//初始化阿里oss
$ossClient=newOssClient($this->id,$this->secret,$this->endpoint);
//上傳
try{
$ossClient->uploadFile($this->bucket,$newName,$tempPath);
}catch(OssException$e){
$this->message=$e->getMessage();
return false;
}
$this->fileName=$newName;
return true;
}
/**
* 返回文件外鏈前綴 即除文件名部分
*
*@returnstring
*/
public functionpreUrl()
{
return'http://'.$this->bucket.'.'.$this->endpoint.'/';
}
/**
* 返回文件文件名
*
*@returnstring
*/
public functionobject()
{
return$this->fileName;
}
/**
* 刪除單個(gè)文件
*
*@paramstring $object 非顯示url 純文件名
*@returnstring
*/
public functiondeleteObject($object)
{
$ossClient=newOssClient($this->id,$this->secret,$this->endpoint);
try{
$ossClient->deleteObject($this->bucket,$object);
}catch(OssException$e){
$this->message=$e->getMessage();
return false;
}
return true;
}
}
具體調(diào)用
//用戶上傳文件
$file=$request->files->get('avatar');
$aliOss=newAliOss($app['ali_oss']);
//oss
if($file!=null){
if($aliOss->put($file,'pathway')){
//用戶頭像存在 刪除oss中已有對(duì)象
if(!empty($user['avatar'])){
$aliOss->deleteObject($user['avatar']);
}
$data['avatar']=$aliOss->object();
}else{
returnJson::renderWithFalse('修改失敗');
}
}
注意
上傳成功后的資源完整鏈接如下:
http://somefiles.oss-cn-shenzhen.aliyuncs.com/pathway5971a374da161.jpg
其中somefiles為bucket名稱
oss-cn-shenzhen.aliyuncs.com為endpoint名稱
pathway5971a374da161.jpg為后臺(tái)生成的資源名稱
前端顯示需要完整鏈接,但是刪除功能,只需要傳該資源名稱就行,不需要帶bucket及endpoint名稱,否則刪除不了。