一、为什么使用七牛云存储
1、使用七牛带宽和CDN,速度快,不占用开发者服务器。
2、支持图片任意格式、任意分辨率自动生成,可以用来做图片服务器。
3、小流量免费:存储空间 10GB,每月下载流量 10GB,每月 PUT/DELETE 10万次请求,每月 GET 100万次请求。当项目发展大时,需要更大流量才需购买。适合互联网创业者。
4、支持webp,画质不变,图片体积大幅度减小,特别适合作移动互联网app的图片服务器。
二、注册七牛云并认证获取免费空间
1. 登录七牛云官网注册账号(已有直接登录);
2. 实名认证(先准备好清晰的人拿身份证正反面照片),大概3个工作日审核通过;
三、申请对象存储空间并获取配置信息
1. 申请对象存储空间:
(1)秘钥信息:AccessKey、SecretKey
(2)空间信息:bucket、domain
注意:
这里的domain信息是七牛云给的测试域名信息,如果要正式使用,点击融合CDN加速域名下的“立即绑定一个域名”,绑定的域名一定要是已备案域名。
配置要绑定域名的域名地址以及其他配置项,如果没什么特殊的需求,直接配置了地址后,默认其他配置就行。
配置完七牛云的“绑定域名”,再到自己域名管理的云平台去解析这个配置域名到七牛云指定的域名,具体参考七牛云绑定域名后的提示。
四、Laravel中的代码操作
1. 安装七牛云扩展
composer require "qiniu/php-sdk"
2. 进入文件 /config/filesystems.php ,在disks数组中配置七牛云配置信息:
'disks' => [
……………… 省略以上 ……………………,
'qiniu' => [
'driver' => 'qiniu',
'access_key' => Accesskey, // 个人中心秘钥管理获取的Accesskey
'secret_key' => SecretKey, // 个人中心秘钥管理获取的SecretKey
'bucket' => bucket, // 空间名称test
'domain' => domain, // 空间绑定的域名,带上http 或者 https
],
],
3. 创建Laravel全局公共七牛云文件管理函数(上传、查询单文件、查询文件列表、删除文件、下载文件)
(1)在/app文件夹下创建Helper文件夹,用于放置项目用到的所有全局函数文件;
(2)在 /app/Helper文件夹下创建qiniu.php文件,该文件用于管理所有七牛云操作函数;
(3)打开根目录下的composer.json文件,配置autoload参数,添加如下自动加载:
// 注意:在composer.json文件中配置每个数组结构的最后一个参数后面都不要加 “,”
"autoload": {
………… 省略以上 …………,
"files": [
"app/Helpers/qiniu.php"
]
},
(4)执行命令,让全局函数文件生效
composer dump-auto
(5)完成qiniu.php的操作函数
file('image')
*/
function qiniuUpload($file)
{
// 构建鉴权对象
$auth = qiniuConfig();
// 生成上传 Token
$token = $auth->uploadToken($config['bucket']);
//获取文件的绝对路径,但是获取到的在本地不能打开
$filePath = $file->getRealPath();
//获取文件的扩展名
$ext = $file->getClientOriginalExtension();
// 新文件名
$key = date('Y-m-d-H-i-s') . '-' . uniqid() .'.'. $ext;
// 初始化 UploadManager 对象并进行文件的上传。
$uploadMgr = new UploadManager();
// 调用 UploadManager 的 putFile 方法进行文件的上传。
$uploadMgr->putFile($token, $key, $filePath);
// 返回上传到云纯属的关键字信息
return $key;
}
/*
* 删除文件
* 参数:$key —— 在七牛云上保存的文件关键字,如:2018-11-16-12-14-03-5bee440ba7e09.png
*/
function qiniuDelete($key)
{
// 构建鉴权对象
$auth = qiniuConfig();
// 构建 UploadManager 对象
$bucketMgr = new BucketManager($auth);
// 删除
$err = $bucketMgr->delete($config['bucket'], $key);
if ($err !== null) {
\Log::alert('deleteImgError', $err);
}
}
/*
* 获取七牛云上的文件列表
* 注意:这里默认是获取前1000个文件,如果需要更多操作,可以自己查Qiniu\Storage\BucketManager中的listFiles方法进行修改。
*/
function qiniuList()
{
// 构建鉴权对象
$auth = qiniuConfig();
// 构建 UploadManager 对象
$bucketMgr = new BucketManager($auth);
// 获取列表信息
list($ret, $err) = $bucketMgr->listFiles($config['bucket']);
// 判断结果
if ($err !== null) {
return ["err"=>1, "msg"=>$err, "data"=>""];
} else {
//返回文件列表完整信息
return $ret;
}
}
/*
* 获取指定文件的元信息,包括文件大小等
* 参数$key:指定文件存储在七牛云上的关键字,如:2018-11-16-12-14-03-5bee440ba7e09.png
*/
function qiniuStat($key)
{
// 构建鉴权对象
$auth = qiniuConfig();
// 构建 UploadManager 对象
$bucketMgr = new BucketManager($auth);
// 获取列表信息
return $bucketMgr->stat($config['bucket'], $key);
}
/*
* 下载指定key值的七牛云文件
* 参数$key:指定文件存储在七牛云上的关键字,如:2018-11-16-12-14-03-5bee440ba7e09.png
*/
function qiniuDownload($key)
{
// 获取指定文件的大小
$fileSize = qiniuStat($key)[0]['fsize'];
// 获取指定key的文件完整路径
$filePath = Config::get('filesystems.disks.qiniu.domain'). "/" . $key;
// 打开浏览器的缓存区
ob_start();
// 构建下载header信息,开始下载
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Disposition:attachment;filename={$key}");
header("Accept-Length:{$fileSize}");
readfile($filePath);
}
(6)控制器中的代码操作示例:
hasFile('image') && $request->file('image')->isValid()) {
return qiniuUpload($request->file('image'));
}
return "请上传文件!";
}
/*
* 删除文件
*/
public function deleteFile(Request $request)
{
$data = $request->validate([
'key' => 'required'
]);
qiniuDelete($data['key']);
}
/*
* 下载文件
*/
public function downloadFile(Request $request)
{
$data = $request->validate([
'key' => 'required'
]);
return qiniuDownload($data['key']);
}
/*
* 获取文件列表
*/
public function listFile()
{
return qiniuList();
}
}
(7)在文件中显示七牛云的文件
因为我们存储在数据库的七牛云文件信息是“key”值,所以在模版中显示七牛云文件时,需要用配置信息domain的值拼接模版获取到文件 key值,组装文件完整访问路径:
// 获取原图
/*
* 获取大小压缩的图片
* 加参数:?imageView/1/w/图片宽度/h/图片高度 ,可以只传宽度或者高度数据
*/
/*
* 获取质量压缩的图片
* format-新图片格式(只有jpg格式图片才能压缩)
* quality-新图片质量
* 加参数:?imageMogr2/format/jpg/quality/质量大小
*/
五、解决七牛云构建鉴权对象Auth类与Laravel扩展用户注册登录认证Auth类冲突
除了以上七牛云给的官方SDK,还可以安装 “超哥” 写的扩展 “overtrue/laravel-filesystem-qiniu”,使用这个扩展,极大地简化了代码,具体操作如下:
1. 安装扩展
composer require "overtrue/laravel-filesystem-qiniu"
2. 配置 /config/app.php 中的providers参数,添加如下代码:
'providers' => [
………… 省略以上 ……………,
Overtrue\LaravelFilesystem\Qiniu\QiniuStorageServiceProvider::class,
]
3. 再和第四大步一样配置七牛云的配置信息,并创建公共函数文件qiniuOver.php。
4. 完成qiniuOver.php操作函数:
getRealPath();
//获取文件的扩展名
$ext = $file->getClientOriginalExtension();
// 新文件名(七牛云上的文件关键字)
$key = date('Y-m-d-H-i-s') . '-' . uniqid() .'.'. $ext;
// 上传文件
Storage::disk('qiniu')->put($key, file_get_contents($path));
return $key;
}
/*
* 删除文件
*/
function qiniuDelete($key)
{
Storage::disk('qiniu')->delete($key);
}
/*
* 获取七牛云上的文件列表
*/
function qiniuList()
{
return Storage::disk('qiniu')->listContents();
}
/*
* 获取指定文件的大小信息
*/
function qiniuSize($key)
{
return Storage::disk('qiniu')->getSize($key);
}
/*
* 下载指定key值的七牛云文件
*/
function qiniuDownload($key)
{
// 获取指定文件的大小
$fileSize = qiniuSize($key);
// 获取指定key的文件完整路径
$filePath = Config::get('filesystems.disks.qiniu.domain'). "/" . $key;
// 打开浏览器的缓存区
ob_start();
// 构建下载header信息,开始下载
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Disposition:attachment;filename={$key}");
header("Accept-Length:{$fileSize}");
readfile($filePath);
}
六、参考文档
1. https://developer.qiniu.com/kodo/sdk/1241/php
2. https://www.jianshu.com/p/c66bb4c68c4f
3. https://www.kancloud.cn/ganti/zqkj/525612
4. https://github.com/overtrue/laravel-filesystem-qiniu