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云存储