阿里云对象存储 OSS 在 TP5.1 中上传文件 的实践
一、 前言
- 鄙人是个php菜鸡,第一次接触阿里云的对象存储,仅以此文章记录下操作流程,供刚入行的朋友参考,如有叙述不妥或技术性问题,愿大家谅解;
- 第一次写文章,望各路大神多多指教;
二、Bucket创建
- 申请开通OSS之后,需要在【Bucket 管理中】创建Bucket,详细位置:控制台->对象存储OSS->Bucket 管理;
- 创建时只需填写Bucket名称,其他的按照提示选择就行,特别需要注意的是读写权限的选择,如果需要客户端上传文件,建议选择公共读写,我选择了私有,发现文件上传的时候虽然提示成功并且返回了url路径,但是在文件管理里找不到我上传的文件,改成公共读写后就正常了
三、类库安装(oss-sdk-php)
使用composer下载oss-sdk-php类库;如果下载慢可以切换到 阿里云 composer 镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
四、PHP后台代码
- PHP的使用,因为我的项目是前后端分离,后台接口是几个客户端的公共接口,根据场景的不同,上传的文件类型也不同,所以不好做后缀判断,便把判断留给了前台;下面代码只是我测试时候的代码,里面涉及私密的项建议大家写成配置文件;
// 首先需要在文件头部引入两个类库
use OSS\OssClient;
use OSS\Core\OssException;
- 上传逻辑如下
public function upload(){
// 阿里云主账号AccessKey,在OSS控制台主页常用入口处有快速通道可以快速查看你的AccessKey ID($accessKeyId)以及Access Key Secret($accessKeySecret )
$accessKeyId = 'LTAIFR4Fk2GUH4XRhBofcsqG';
$accessKeySecret = '5wyj277QASDsYsScvhkpEtyM0RVztC';
//Endpoint(地域节点)查看位置在文章下方
$endpoint = 'http://oss-cn-beijing.aliyuncs.com';
//创建Bucket填写的名称
$bucket = 'yaoxifsojiang';
//设置保存的路径(前面不要加'/',否则会出错)
$path = 'upload/' . date('Ymd', time()) . '/';
//下面这三项应该都知道
$name = $_FILES['file']['name'];
$tmp_name = $_FILES['file']['tmp_name'];
$error = $_FILES['file']['error'];
//过滤错误(临时测试时使用,代码写的比较简陋)
if ($error) {
switch ($error) {
case 1 :
$error_message = '您上传的文件超过了PHP.INI配置文件中UPLOAD_MAX-FILESIZE的大小';
break;
case 2 :
$error_message = '您上传的文件超过了PHP.INI配置文件中的post_max_size的大小';
break;
case 3 :
$error_message = '文件只被部分上传';
break;
case 4 :
$error_message = '文件不能为空';
break;
default :
$error_message = '未知错误';
}
die($error_message);
}
//文件名生成
$arr_name = explode('.', $name);
//源文件的后缀
$hz = array_pop($arr_name);
//新的文件名
$new_name = md5(time() . uniqid()) . '.' . $hz;
//文件在OSS上的URL
$url=$path.$new_name;
//抛出异常
try{
//相比传统的操作,其实就多了两个步骤
//第一步是根据上面的参数实例化一个对象
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
//这一步相当于之前把临时文件移入到设置的地址那步,只是以前的是自己的服务器上,现在是OSS;
$result =$ossClient->uploadFile($bucket,$url,$tmp_name);
//返回的参数
if (isset($result['info']['http_code']) AND $result['info']['http_code']==200) {
return $this->buildSuccess([
'fileName' => $new_name,
'fileUrl' => $result['info']['url']
]);
}else{
return $this->buildFailed(ReturnCode::FILE_SAVE_ERROR, '文件上传失败');
}
} catch(OssException $e) {
$msg = $e->getMessage();
return $this->buildFailed(ReturnCode::FILE_SAVE_ERROR, $msg);
}
}