Single

阿里云OSS设置防盗链,以及如何访问资源

为什么设置防盗链?防盗链是为了防止您存储于对象存储OSS的数据被其他人盗链而产生额外的费用。

如何设置防盗链?

1、登录OSS管理控制台

2、进入Bucket列表,选择所需要操作的Bucket;

3、选择好目标后,点击权限管理->防盗链;

4、设置Referer白名单配置。

阿里云OSS防盗链文档:传送门


设置好后,你会发现之前的资源全都无法访问了,不要慌,OSS上设置了防盗链的资源需要通过授权访问。


如何访问设置了防盗链的资源?

可以将生成的签名URL提供给访客进行临时访问。生成签名URL时,您可以通过指定URL的过期时间来限制访客的访问时长。

这里以tp5为例

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 $filePath 原图片路径
     * @return string
     */
    public static function imgSignUrl($filePath)
    {
        try{
            self::autoInfo();
            $str = 'https://'.self::$bucket.'.'.self::$endPoint;
            return self::$auth->signUrl(self::$bucket,substr($filePath,strlen($str)),3600);
        }catch (OssException $e){
            return $e->getMessage();
        }
    }
}

加载该类,调用imgSignUrl()方法即可。

想要找点什么呢?