1、开通阿里云OSS对象存储服务,创建Bucket,配置AccessKey,配置完后拿到accessKeyID、accessKeySecret、endPoint、bucket;
2、下载安装SDK
示例文档:SDK文档
下载地址:通过GitHub下载
3、后端结合SDK实现文件上传至阿里云OSS
以thinkphp为例,这里所需要的accessKeyID、accessKeySecret、endPoint、bucket配置信息我个人是存放到数据库中,也可以配置到config文件中,看个人习惯。
namespace app\common\services\storage;
use OSS\OssClient;
use OSS\Core\OssException;
use think\facade\Cache;
use app\admin\model\SystemConfig as ConfigModel;
/**
* 阿里云OSS自定义类
* Class OSS
*/
class OSS
{
protected static $accessKeyID;
protected static $accessKeySecret;
protected static $endPoint;
protected static $bucket;
protected static $auth = null;
/**
* 初始化
* @return null|OssClient
*/
protected static function autoInfo(){
if(($bucket = Cache::get('bucket')) && ($endPoint = Cache::get('endPoint')) && ($accessKeyID = Cache::get('accessKeyID')) && ($accessKeySecret = Cache::get('accessKeySecret'))){
self::$accessKeyID = $accessKeyID;
self::$accessKeySecret = $accessKeySecret;
self::$endPoint = $endPoint;
self::$bucket = $bucket;
}else{
self::$accessKeyID = ConfigModel::getConfigValue('accessKeyID');
self::$accessKeySecret = ConfigModel::getConfigValue('accessKeySecret');
self::$endPoint = ConfigModel::getConfigValue('endPoint').'/';
self::$bucket = ConfigModel::getConfigValue('bucket');
Cache::set('accessKeyID',self::$accessKeyID);
Cache::set('accessKeySecret',self::$accessKeySecret);
Cache::set('endPoint',self::$endPoint);
Cache::set('bucket',self::$bucket);
}
if(!self::$accessKeyID || !self::$accessKeySecret || !self::$endPoint || !self::$bucket){
exception('请设置 accessKeyID 和 accessKeySecret 和 地域节点 和 Bucket域名');
}
if(self::$auth == null) {
self::$auth = new OssClient(self::$accessKeyID,self::$accessKeySecret,self::$endPoint);
//私有:OssClient::OSS_ACL_TYPE_PRIVATE 公共读:OssClient::OSS_ACL_TYPE_PUBLIC_READ 公共读写:OssClient::OSS_ACL_TYPE_PUBLIC_READ_WRITE
if(!self::$auth->doesBucketExist(self::$bucket)) self::$auth->createBucket(self::$bucket,self::$auth::OSS_ACL_TYPE_PUBLIC_READ_WRITE);
}
return self::$auth;
}
/**
* 图片上传
* @param string $filename
* @return string
*/
public static function uploadImage($filename = 'image'){
$request = app('request');
$file = $request->file($filename);
$fileInfo = $file->getInfo();
$filePath = $file->getRealPath();
$ext = substr(strrchr($fileInfo['name'], '.'), 1);
$fileName = date('Y') . '/' . date('m') . '/' . sha1(date('YmdHis') . rand(0, 9999)) . '.' . $ext;
try{
self::autoInfo();
return self::$auth->uploadFile(self::$bucket,$fileName,$filePath);
}catch (OssException $e){
return $e->getMessage();
}
}
}
控制器直接加载该类,调用uploadImage方法即可实现oss文件上传。