技术饭
PHP SDK上传文件到阿里云oss文件存储Bucket
对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。最近业务需求做了PHP SDK上传文件到阿里云oss文件存储Bucket的相关工作。
OSS的PHP SDK文档:https://help.aliyun.com/document_detail/32099.html?spm=a2c4g.11186623.6.1103.108b5a674vBTCh
OssClient初始化:https://help.aliyun.com/document_detail/32100.html?spm=a2c4g.11186623.6.1106.108b5a67FU2PaU
文件追加上传:https://help.aliyun.com/document_detail/88476.html?spm=a2c4g.11186623.6.1124.6aff56d2a9oKoI
1、创建Bucket:在阿里oss控制器创建Bucke,配置好读写权限、跨域权限等

2、如果想自定义域名来访问oss存储上的文件,那么则需要解析cname到oss云存储,如果需要加上cdn则需要吧域名解析cname到cdn域名,然后cdn域名回源oss域名就好了

3、获取配置的accessKeyId、accessKeySecret等信息,其中如果使用了自定义的域名Endpoint上传,上传速度可能会慢很多


4、上传关键代码:重点在try {} catch(){} 部分,一个是实例化 OssClient,一个是批量追加文件上传 appendFile,当需要OssClient的第四个参数配置为true时是自定义域名,这个时候需要将Endpoint改为自定义域名
/**
* [CreateUploadImage 上传图片]
*/
public function CreateUploadImage() {
if($this->request->isPost()){
//获取参数
$upload_images = $_FILES['images'];
//验证上传文件数量
$upload_images_count = count($upload_images['name']);
if($upload_images_count <= 0 || $upload_images_count > 15){
//返回数据
$rdata['code'] = 0;
$rdata['msg'] = '上传文件数量上限15个';
return json($rdata);
}
//处理组装数组
$upload_images_list = [];
//类型数组
$img_type = ['image/jpeg', 'image/png', 'image/gif', 'image/jpg'];
//类型对应拓展名数组
$ext_type = ['image/jpeg' => 'jpg', 'image/png' => 'png', 'image/gif' => 'gif', 'image/jpg' => 'jpg'];
//处理数据
for ($i = 0; $i < $upload_images_count; $i++) {
//验证如果有文件异常则直接报错
if($upload_images['error'][$i] != 0){
break;
//返回数据
$rdata['code'] = 0;
$rdata['msg'] = '文件:'.$upload_images['name'][$i].'上传错误';
return json($rdata);
}
//验证拓展名称
if(!in_array($upload_images['type'][$i], $img_type)){
break;
//返回数据
$rdata['code'] = 0;
$rdata['msg'] = '文件:'.$upload_images['name'][$i].'不是图片类型';
return json($rdata);
}
//名称
$upload_images_list[$i]['name'] = $upload_images['name'][$i];
//类型
$upload_images_list[$i]['type'] = $upload_images['type'][$i];
//临时名
$upload_images_list[$i]['tmp_name'] = $upload_images['tmp_name'][$i];
//错误
$upload_images_list[$i]['error'] = $upload_images['error'][$i];
//大小
$upload_images_list[$i]['size'] = $upload_images['size'][$i];
//获取拓展名称
$upload_images_list[$i]['ext_name'] = $ext_type[$upload_images['type'][$i]];
}
//验证上传文件数量
if(empty($upload_images_list)){
//返回数据
$rdata['code'] = 0;
$rdata['msg'] = '上传文件数量上限15个';
return json($rdata);
}
//oss上传配置信息
$this->accessKeyId = config('img.accessKeyId');
$this->accessKeySecret = config('img.accessKeySecret');
$this->endpoint = config('img.endpoint');
$this->bucket = config('img.bucket');
$this->domain = config('img.domain');
$this->dir = 'qingdaoshizhuangzhou2020';
//加载自动加载文件
require_once env('extend_path') . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
//上传成功文件列表
$upload_images_success = [];
try {
//实力话oss存储类
//$ossClient = new \OSS\OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint, true);
$ossClient = new \OSS\OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
//循环上传文件
foreach ($upload_images_list as $key => $value) {
//设置文件名称
$object = $this->dir ."/". create_order_sn(1, 'qdszg2020') . "." . $value['ext_name'];
$position = $ossClient->appendFile($this->bucket, $object, $value['tmp_name'], 0);
if($position > 0){
$upload_images_success[$key]['name'] = $value['name'];
$upload_images_success[$key]['sort'] = $position;
$upload_images_success[$key]['thumb'] = $this->domain . $object;
$upload_images_success[$key]['photo'] = $this->domain . $object;
$upload_images_success[$key]['type'] = 'images';
$upload_images_success[$key]['oringinal_type'] = 'images';
$upload_images_success[$key]['location'] = 'upload';
}
}
//返回数据
$rdata['code'] = 1;
$rdata['msg'] = '上传图片成功';
$rdata['data'] = !empty($upload_images_success) ? $upload_images_success : '';
return json($rdata);
} catch(\OSS\Core\OssException $e) {
//返回数据
$rdata['code'] = 0;
$rdata['msg'] = $e->getMessage();
return json($rdata);
}
}
}5、总结:在过程中可能会遇一些小问题,有时候会出现https不安全,图片不显示等问题,这可能是配置出了错。
文明上网理性发言!