PHP配置阿里云OSS

【今日推荐】:为什么一到面试就懵逼!>>> hot3.png

  • 目录
  • 1. 前言
  • 2. 下载SDK
  • 3. 初始化配置
  • 3.1第一步:引入官方的SDK
  • 3.2第二步:初始化配置项
  • 3.3各种操作的简易封装
  • 3.3.1 创建存储空间函数
  • 3.3.2上传文件函数
  • 4. 针对需求高级调用函数封装
  • 4.1 二次封装的图片上传函数
  • 4.2测试图片上传函数
  • 4.2.1前端,详见index.html
  • 4.2.2逻辑层,详见doAction.php
  • 4.3返回结果
  • 5. 防盗链添加和理解
  • 5.1 代码注意事项
  • 1)开头引入SDK
  • 2)修改析构函数
  • 5.2 Referer白名单
  • 5.2.1 Referer为空,且没有设置addReferer
  • 5.2.2 Referer为空,且设置了addReferer
  • 5.2.3 Referer不为空,且设置了addReferer
  • 5.2.4 Referer不为空,且没有设置addReferer
  • 5.2.5 防盗链配置总结
  • 6. 总结

1. 前言

经常听说过七云牛OSS、阿里云OSS等等,但是经过了那么久的搬砖,自己居然还不是很了解如何使用OSS云存储,感觉面子有点过不去啊,刚好公司的项目也用到了阿里云的OSS文件存储,那么让我对照着官方文档一步一步搭建自己的私有云吧!

代码分享:https://github.com/mtdgclub/aliyunOssDemo

2. 下载SDK

具体操作详见官方该文档页:https://help.aliyun.com/document_detail/85580.html

购买事项:

1)这里强烈推荐购买一年40G的OSS对象存储,只需9块钱!!

2)建议OSS选择地区和你的云服务器地区一致,这样内网访问不需要流量花销。

3)购买完成,创建bucket,根据自己需求选择权限,推荐选择公共读

4)有必要的话,建议使用防盗链,该文章也会讲到这方面

3. 初始化配置

下面我们开始初始化配置,如果不熟悉建议去官方文档多看几次,为了方便熟悉,我把OSS封装成项目的常用类,如果你不熟悉,建议你敲一遍代码哈~

3.1第一步:引入官方的SDK

//引入官方的SDK
if (is_file(__DIR__ . '/aliyunoss-sdk/autoload.php')) {
    require_once __DIR__ . '/aliyunoss-sdk/autoload.php';
}

3.2第二步:初始化配置项

//初始化配置
if(DEBUG){
    // 存储空间名称
    $this->bucket = "save-test-fangzhijie";
    $this->endpoint='oss-cn-shenzhen.aliyuncs.com';//外网
}else{
    // 存储空间名称
    $this->bucket = "save-test-fangzhijie";
    $this->endpoint='oss-cn-shenzhen-internal.aliyuncs.com';//内网
}
$this->accessKeyId = "LTAI4FtvNnPVgLaoYdgyrA3W";
$this->accessKeySecret = "";
// 文件内容
$this->content = '';
// 上传文件路径,由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt
$this->filePath = '';
$this->ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);

3.3各种操作的简易封装

根据官方文档的介绍,我对以下几种入门操作,进行封装。

3.3.1 创建存储空间函数

public function createBucket(){
    try {
        $this->ossClient->createBucket($this->bucket);
    } catch (OssException $e) {
        return self::debugLog($e);
    }
    return true;
}

3.3.2上传文件函数

public function uploadObject($type='string'){
    try {
        if($type=='string'){//字符串上传
            $this->ossClient->putObject($this->bucket, $this->object, $this->content);
        }elseif($type=='file'){//文件上传
            $info = $this->ossClient->uploadFile($this->bucket, $this->object, $this->filePath);
            //存储文件访问的URL
            $this->ossUrl = $info['oss-request-url'];
        }
    } catch (OssException $e) {
        return self::debugLog($e);
    }
    return true;
}

其他的操作可以看官方文档,我也会持续更新其他操作

4. 针对需求高级调用函数封装

在完成基本封装函数下,我们针对不同需求再次封装功能函数,这里我举例封装一个图片上传函数,并做简单测试

4.1 二次封装的图片上传函数

/**
 * 二次封装的图片上传函数
 * @param object $object 上传的临时文件资源
 * @return array 返回数组
 */
public function updateImg($object){
    if(is_array($object) and !empty($object['name']) and !empty($object['tmp_name'])){
        //得到文件后缀
        $ext = pathinfo($object['name']);
        $ext = strtolower($ext['extension']);
        //定义允许上传的类型
        $allow_type = array('jpg','jpeg','gif','png');
        //是否允许上传
        if(!in_array($ext, $allow_type)){
            return array('code'=>0,'msg'=>'格式有误');
        }
        // 临时文件路径
        $this->filePath = $tempFile = $object['tmp_name'];
        //移动到的路径
        $targetPath  = 'upload/'.date('Ymd');
        $filename=date("His");
        $new_file_name = $filename.'.'.$ext;
        $this->object = $targetFile = $targetPath .'/'. $new_file_name;
        //$ok = $this->ossClient->uploadFile($this->bucket, $targetFile, $tempFile);
        $ok = self::uploadObject('file');
        if($ok != true){
            $data=$ok;
        } else {
            $imgUrl = $targetPath.'/'.$new_file_name;
            $data = array('code'=>1,'imgUrl'=>$imgUrl,'ossUrl'=>$this->ossUrl);
        }
    }else{
        $data=array('code'=>0,'msg'=>'File is not exist');
    }
    return $data;
}

4.2测试图片上传函数

4.2.1前端,详见index.html



    
    

    

4.2.2逻辑层,详见doAction.php


require_once 'Aliyunoss.php';
$oss = new Aliyunoss();
$res = $oss->updateImg($_FILES['file']);
//var_dump($res);
?>


    Upload complete



File upload succeeded...



File upload fail...




        
  • Sent:

  •     
  • Size: bytes

  •     
  • Type:



    

这是上传后用,从OSS获取的图片


    


4.3返回结果

PHP配置阿里云OSS_第1张图片

查看阿里云控制台的OSS文件管理

PHP配置阿里云OSS_第2张图片

5. 防盗链添加和理解

5.1 代码注意事项

5.1.1开头引入SDK

use OSS\Model\RefererConfig;

5.1.2修改析构函数

//设置防盗链
$refererConfig = new RefererConfig();
// 设置允许空Referer。
$refererConfig->setAllowEmptyReferer(true);
// 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。
$refererConfig->addReferer("www.mtdg.club");
$refererConfig->addReferer("www.mtdgblog.com");
try{
    $this->ossClient->putBucketReferer($this->bucket, $refererConfig);
} catch(OssException $e) {
    $data=array('code' => 0,'title' =>'防盗链设置失败','msg' =>$e->getMessage());
    return $data;
}

5.2 Referer白名单

5.2.1 Referer为空,且没有设置addReferer

如果允许空Referer,且没有设置addReferer,那么允许所有域名访问OSS的URL

PHP配置阿里云OSS_第3张图片

PHP配置阿里云OSS_第4张图片

5.2.2 Referer为空,且设置了addReferer

如果允许空Referer,且设置了addReferer,如果访问的域名没有设置在addReferer,此时通过不在白名单的域名则不允许访问该OSS的URL,但是可以在空Referer情况下访问

PHP配置阿里云OSS_第5张图片

PHP配置阿里云OSS_第6张图片

但可以通过直接访问来下载(即Referer为空情况下)

up-9fb1bf2e830fc1e4bdf80d3475bf2da73d0.png

5.2.3 Referer不为空,且设置了addReferer

如果不允许空Referer,且设置了addReferer,如果访问的域名没有设置在addReferer,此时通过不在白名单的域名不允许访问该OSS的URL,且不允许在空Referer情况下访问

PHP配置阿里云OSS_第7张图片

PHP配置阿里云OSS_第8张图片

此时,直接访问也不允许下载了

PHP配置阿里云OSS_第9张图片

5.2.4 Referer不为空,且没有设置addReferer

如果不允许空Referer,且没有设置了addReferer,如果访问的URL没有设置在addReferer,此时通过不在白名单的域名允许访问该OSS的URL,且允许在空Referer情况下访问

PHP配置阿里云OSS_第10张图片

PHP配置阿里云OSS_第11张图片

PHP配置阿里云OSS_第12张图片

5.2.5 防盗链配置总结

总的来说,设置反盗链需要满足一定条件才能生效,具体配置理解如下表所示:

Referer

addReferer

不在白名单的域名访问

下载文件

安全性

没设置

成功

成功

设置

失败

成功

非空

设置

失败

失败

非空

没设置

成功

成功

6.总结

以上就是我对阿里云OSS的基础运用学习,学习的时候,也了解到一些更高级的操作,如:对大文件进行分割上传等,希望自己后续抽时间学习高级操作,加油~

 

你可能感兴趣的:(PHP配置阿里云OSS)