阿里OSS对象存储的简单使用

概念理解

阿里有一套自己的相关概念,既然要用人家的产品,就要按照人家的要求来。
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 设置跨域规则如下图,有特殊要求具体处理。
阿里OSS对象存储的简单使用


代码部分


相应类
<?php

namespace PFinal\Storage;

use OSS\Core\OssException;
use OSS\OssClient;

class AliOss
{
    protected $id;
    protected $secret;
    protected $endpoint;
    protected $bucket;
    protected $maxSize = 5; //单位G 阿里单次上传文件限制
    public $message;
    protected $fileName;

    public function __construct(array $config = array())
    {
        foreach ($config as $key => $item) {
            $this->$key = $item;
        }
    }

    /**
     * 上传文件
     *
     * @param object $file
     * @param string $key
     * @return bool
     */
    public function put($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 = new OssClient($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;
    }

    /**
     * 返回文件外链前缀 即除文件名部分
     *
     * @return string
     */
    public function preUrl()
    {
        return 'http://' . $this->bucket . '.' . $this->endpoint . '/';
    }

    /**
     * 返回文件文件名
     *
     * @return string
     */
    public function object()
    {
        return $this->fileName;
    }

    /**
     * 删除单个文件
     *
     * @param string $object 非显示url 纯文件名
     * @return string
     */
    public function deleteObject($object)
    {
        $ossClient = new OssClient($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 = new AliOss($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 {
        return Json::renderWithFalse('修改失败');
    }
}

注意

上传成功后的资源完整链接如下:

http://somefiles.oss-cn-shenzhen.aliyuncs.com/pathway5971a374da161.jpg

其中somefiles为bucket名称
oss-cn-shenzhen.aliyuncs.com为endpoint名称
pathway5971a374da161.jpg为后台生成的资源名称

前端显示需要完整链接,但是删除功能,只需要传该资源名称就行,不需要带bucket及endpoint名称,否则删除不了。


如果对你有帮助,请打赏1元买水喝。阿里OSS对象存储的简单使用阿里OSS对象存储的简单使用