概念理解
阿里有一套自己的相关概念,既然要用人家的产品,就要按照人家的要求来。
Bucket存储空间
Object需要存储的对象
Region地域
Endpoint访问域名
Region和Endpoint要相对应,杭州 Region 的外网 Endpoint 是 oss-cn-hangzhou.aliyuncs.com,内网 Endpoint 是 oss-cn-hangzhou-internal.aliyuncs.com。这个在阿里文档中也有解释。
AccessKeyId和AccessKeySecret是加密解密及身份标识所需数据,每个账号都有,自己去控制台翻翻。
拿到这几个数据后,再下载阿里oss对象存储sdk,就可以进行代码编写操作了。
不过在这之前还是要做几步简单操作
1 去管理控制台创建一个存储空间bucket,一般选标准存储类型,权限选公共读,私有写。
2 设置跨域规则如下图,有特殊要求具体处理。
代码部分
相应类
<?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='文件大小不能超过'.$maxSize.'G';
return false;
}
//本地临时文件
$tempPath=$file->getPathName();
//原扩展
$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;
}
/**
* 删除单个文件
*
*@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;
}
}
具体调用
//用户上传文件
$file=$request->files->get('avatar');
$aliOss=newAliOss($app['ali_oss']);
//oss
if($file!=null){
if($aliOss->put($file,'pathway')){
//用户头像存在 删除oss中已有对象
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为后台生成的资源名称
前端显示需要完整链接,但是删除功能,只需要传该资源名称就行,不需要带bucket及endpoint名称,否则删除不了。