laravel处理图像上传OSS云存储(含图像处理,防盗链)

laravel框架中集成intervention-image上传阿里OSS(含图像处理,防盗链)


前言

前言:作为一名全栈开发,和图像处理打交道是习以为常,主要是以前端为主.对于前端来说,图像处理都还好说,也比较简单。但对于应用后台,或者接口而言,毕竟主要工作是处理数据的,图像处理方面比较少,但是现在后台处理图片功能,也会越来越多,以下举几个例子:

(1)特定活动海报,(电商app常见)

(2)个人名片(笔者基于此开发功能)

(3)各种各样的分享

所以今天特向 PHP 工程师们推荐一个 Intervention Image 图片处理插件,它提供了一套易于表达的方式来创建、编辑图片。
————————————————


一、Intervention Image是什么?

Intervention Image:Intervention Image是一个开源的PHP图像处理和操作库。它提供了一种创建,编辑和合成图像的简便且富有表现力的方式,并且目前支持两个最常见的图像处理库GD Library和Imagick。

该类是为了使PHP图像操作更容易和更具表现力。无论您是要创建图像缩略图,水印还是对大型图像文件进行格式化,Intervention Image都可以帮助您以最少的代码行轻松地管理每个任务。

该库遵循FIG标准PSR-2,以确保共享的PHP代码之间的高度互操作性,并且经过了完全的单元测试。

入门
该库至少需要PHP版本5.4,并随附Laravel Facades和服务提供商,以简化可选框架的集成。

1、下载阿里云SDK

composer require aliyuncs/oss-sdk-php

2、下载image类库文件

composer require intervention/image

二、使用步骤

1.定义路由

以下在laravel中routes文件的api.php中定义接口路由:

//商品图片上传接口
Route::post('upload',[\App\Http\Controllers\Api::class,'upload']);

2.引入库

操作代码如下:

use OSS\OssClient;//引入阿里云OSS云存储
use OSS\Core\OssException;//引入阿里云OSS云存储异常机制
use OSS\Model\RefererConfig;//引入阿里云防盗链
use Intervention\Image\Facades\Image;//引入Intervention  Image类库
 public function upload(Request $request)
    {
        //获取文件上传的路径
        $file=$request->file('file')->store('','upload');
        //引用系统字体文件
        $fontPath=public_path('HanYiQingKongTiJian-1.ttf');
        //调用Intervention Image类库进行制作缩略图并添加文字水印操作(可以使用链式操作多级处理)
        //fit()自适应图片大小   text()水印文字 样式    使用use引入$fontPath(字体)
        Image::make("./upload/".$file)
        ->fit(300,300)
        ->text('抽奖',135,135,function ($font)use ($fontPath){
            $font->file($fontPath)
                 ->size(20)//字体大小
                 ->color('#000')//字体颜色(支持十六进制颜色码)
                 ->valign('center');//对齐方式
        })->save("./upload/".$file);//覆盖原文件
        // 阿里云AccessKey和AccessKeySecret
        $accessKeyId = "********";
        $accessKeySecret = "*******";
        // Endpoint为上海,其它Region请按实际运营情况填写。
        $endpoint = "http://oss-cn-shanghai.aliyuncs.com";
        // 设置存储空间名称。
        $bucket= "****";
        // 设置文件名称。
        $object = time().'.jpg';
         //实例化阿里云防盗链基类
        $refererConfig = new RefererConfig();
        // 设置允许空Referer(防盗链可以为空)。
        $refererConfig->setAllowEmptyReferer(true);
        //如文件无法预览,说明Bucket设置了 Referer(防盗链设置成功)
        //建议在Refere白名单中加上 *.console.aliyun.com。
        // 添加Referer白名单。Referer参数支持通配符星号(*)和问号(?)。
         //替换成*.console.aliyun.com 图片可以正常预览
        $refererConfig->addReferer("*.console.aliyun.com"); 
       	//可以设置多个防盗链
        $refererConfig->addReferer("www.aliiyuncs.com");
        //使用错误抛出机制
        try{
            //阿里云OSS云存储
            $ossClient = new OssClient($accessKeyId,$accessKeySecret, $endpoint);
            //注意文件上传的路径  需要public_path()定位上传的文件的路径 相对路径可能会失效
            $ossClient->uploadFile($bucket, $object, public_path("/upload/".$file));
            //给对应的空间名称配置防盗链并推送到云端配置
            $ossClient->putBucketReferer($bucket, $refererConfig);
        } catch(OssException $e) {
            printf(__FUNCTION__ . ": FAILED\n");
            printf($e->getMessage() . "\n");
            return;
        }
        print(__FUNCTION__ . ": OK" . "\n");
    }

水印字体下载链接
在这里插入图片描述
也可以使用windows系统自带的字体

3.输出结果

以下是浏览器接口最后输出结果:

在这里插入图片描述

图片效果处理如下图:
在这里插入图片描述


总结

排除设置防盗链可能出现的问题:

  • Referer为空,请求Header中没有Referer字段或者Referer字段为空。

Referer不在规定的Referer范围内。以下几点请注意:

  • http://还是https://配置时请确认;
  • a.aliyun.com和b.aliyun.com,匹配于http://.aliyun.com或http://.aliyun.com;
  • domain.com匹配于http://domain.com,而不是http://*.domain.com;
  • Referer格式错误,Refer配置必须带http://或者https://,否则无效。如b.aliyun.com是无效配置。

提示

在对象存储OSS -> Bucket -> Bucket属性 -> 防盗链 中配置Referer;

调试时请清空浏览器缓存;

OSS的Refer只支持 白名单, 暂时不支持黑名单 。

部分代码转载于:阿里OSS防盗链

部分代码转载于:阿里OSS云存储

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值