最近项目中用到了上传图片到七牛的功能,我们的框架用的是thinkphp5.1,研究了半天,下边记录一下
上传图片
1、安装七牛sdk,我是通过composer安装的,也可以直接去官网下载sdk,运行到项目的根目录下,然后运行composer require qiniu/php-sdk,等一会就自己安装好了
2、在extend文件夹下建个文件夹名字叫qiniu,里边新建个文件建Qiniu.php
3、开始在Qiniu.php文件中集成上传图片的方法,直接上代码
<?php
namespace qiniu;
use Qiniu\Auth;
use Qiniu\Storage\UploadManager;
class Qiniu
{
const QINIU_URL = '你的七牛图片地址';
const ACCESS_KEY = '你的ACCESS_KEY ';
const SECRET_KEY = '你的SECRET_KEY ';
const BUCKET = '你的BUCKET';
/**
* 获取token
* @return string
*/
public static function createToken()
{
// 构建鉴权对象
$auth = new Auth(self::ACCESS_KEY, self::SECRET_KEY);
// 生成上传token
$token = $auth->uploadToken(self::BUCKET, $key = null, 3600, ['mimeLimit' => 'image/*'], true);
// 返回token
return $token;
}
/*
* 上传图片
* */
public static function uploads($file)
{
//$file = request()->file('file');
// 要上传图片的本地路径
$filePath = $file->getRealPath();
$ext = pathinfo($file->getInfo('name'), PATHINFO_EXTENSION); //后缀
// 上传到七牛后保存的文件名
$key =substr(md5($file->getRealPath()) , 0, 5). date('YmdHis') . rand(0, 9999) . '.' . $ext;
// 需要填写你的 Access Key 和 Secret Key
$accessKey = self::ACCESS_KEY;
$secretKey = self::SECRET_KEY;
// 构建鉴权对象
$auth = new Auth($accessKey, $secretKey);
// 要上传的空间
$bucket = self::BUCKET;
$token = $auth->uploadToken($bucket);
// 初始化 UploadManager 对象并进行文件的上传
$uploadMgr = new UploadManager();
// 调用 UploadManager 的 putFile 方法进行文件的上传
list($ret, $err) = $uploadMgr->putFile($token, $key, $filePath);
if ($err !== null) {
return ["err"=>1,"msg"=>$err,"data"=>""];
} else {
//返回图片的完整URL
return ["err"=>0,"msg"=>"上传完成","data"=>($ret['key'])];
}
}
}
删除图片
有上传功能肯定也得有删除功能,我也做了一下图片删除的功能,但是一直有bug,明明删除了,却还可以访问,例如删除的图片路径是 https://qiniu.test.cn/dsakdjalskdjas.jpeg ,如果删除后直接访问的话还是可以访问到的,如果通过携带参数的方式访问的就就提示找不到 https://qiniu.test.cn/dsakdjalskdjas.jpeg?id=123,去七牛的库里看了一下,确实删除了,不知道是不是因为七牛的缓存导致的,有感兴趣的同学可以在评论里和我讨论一下,下面贴一下我的代码
/*
* 删除图片
* */
public static function deletePicture()
{
$accessKey = self::ACCESS_KEY;
$secretKey = self::SECRET_KEY;
$bucket = self::BUCKET;
$key = request()->param('img');
$auth = new Auth($accessKey, $secretKey);
$config = new \Qiniu\Config();
$bucketManager = new \Qiniu\Storage\BucketManager($auth, $config);
$err = $bucketManager->delete($bucket, $key);
if ($err=='') {
return true;
}else{
return false;
}
}
添加水印
后来需求中用到了图片加水印的功能,我们的需求是在原图的下方(图片外边)添加上姓名和手机号(姓名和手机号分成上下两行),在图片外边添加水印,什么鬼,苦于没有思路,去百度了下,有大神说可以换个角度,把图片和文字都看成是水印,也就是找一张大点的白色背景图,在把图片和想加的文字都当成水印添加到白色背景图上,感觉真是神人啊,有了思路,又查了下七牛的文档,他们提供有图片水印加文字水印的混合水印接口,刚好,下边是我写的代码
/*
* 添加水印
* $param['path'] 图片水印路径
* $param['text'] 第一行文字水印
* $param['phone'] 第二行文字水印
* $prefix 为true时生成图片,为假时只生成水印
* */
public static function addWaterMark($param=[],$prefix="")
{
// $param = [
// 'path'=>'https://qiniu.test.cn/9401c201906191833343644.png',
// 'text' => '资金周转就找我',
// 'phone'=>'15617774562'
// ];
if($prefix){
//提前上传到七牛的白色背景图
$path = 'https://qiniu.test.cn/b1d7a201906191849244939.jpg?';
}else{
$path = '';
}
$path .= 'watermark/3';
$path .= '/image/'.urlsafe_b64encode($param['path']);
$path .= '/dissolve/100/gravity/North/dx/0/dy/-2/ws/1';
$path .= '/text/'.urlsafe_b64encode($param['text']);
$path .= '/font/'.urlsafe_b64encode('黑体');
$path .= '/fontsize/240';
$path .= '/fill/'.urlsafe_b64encode('#333333');
$path .= '/gravity/South/dx/0/dy/24';
$path .= '/text/'.urlsafe_b64encode($param['phone']);
$path .= '/font/'.urlsafe_b64encode('黑体');
$path .= '/fontsize/240';
$path .= '/fill/'.urlsafe_b64encode('#333333');
$path .= '/gravity/South/dx/0/dy/5';
return $path;
}
上边就是我最近用到的功能了,以后用到其他功能的话在添加吧,有没有看明白的可以在评论里问我