PHP配置阿里云OSS

【今日推荐】:为什么一到面试就懵逼!>>> PHP配置阿里云OSS

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 = '';
// 上传文件路径,<yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/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

<body>
<form action="doAction.php" class="file" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br/>
    <input type="submit" value="上传">
</form>

4.2.2逻辑层,详见doAction.php

<?php
require_once 'Aliyunoss.php';
$oss = new Aliyunoss();
$res = $oss->updateImg($_FILES['file']);
//var_dump($res);
?>
<html>
<head>
    <title>Upload complete</title>
</head>
<body>
<?php if($res['code']==1){?>
<h3>File upload succeeded...</h3>
<?php }else{ ?>
<h3>File upload fail...</h3>
<?php }?>
<ul>
    <li>Sent: <?php echo $_FILES['file']['name']; ?></li>
    <li>Size: <?php echo $_FILES['file']['size']; ?> bytes</li>
    <li>Type: <?php echo $_FILES['file']['type']; ?></li>
</ul>
<div>
    <h4>这是上传后用,从OSS获取的图片</h4>
    <img src="<?php echo $res['ossUrl'];?>" alt="" width="300" height="300">
</div>
</body>
</html>

4.3返回结果

PHP配置阿里云OSS

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

PHP配置阿里云OSS

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

PHP配置阿里云OSS

5.2.2 Referer为空,且设置了addReferer

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

PHP配置阿里云OSS

PHP配置阿里云OSS

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

PHP配置阿里云OSS

5.2.3 Referer不为空,且设置了addReferer

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

PHP配置阿里云OSS

PHP配置阿里云OSS

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

PHP配置阿里云OSS

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

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

PHP配置阿里云OSS

PHP配置阿里云OSS

PHP配置阿里云OSS

5.2.5 防盗链配置总结

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

Referer

addReferer

不在白名单的域名访问

下载文件

安全性

没设置

成功

成功

设置

失败

成功

非空

设置

失败

失败

非空

没设置

成功

成功

6.总结

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