Single

PHP 上传文件至阿里云OSS对象存储

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文件上传。

想要找点什么呢?