接着上3篇笔记:
使用 qshell 将本地文件同步到七牛云
https://blog.csdn.net/beyond__devil/article/details/83030702
将 laravel 项目内静态文件,css、js、images 部署到七牛云 csdn
https://blog.csdn.net/beyond__devil/article/details/83057313
laravel 添加 七牛云 存储驱动
https://blog.csdn.net/beyond__devil/article/details/83065677
已经有高手写了 laravel 的七牛云依赖包了,在 packagist.org 键入 qiniu,就可以搜索出相关的包,我们使用:
zgldh/qiniu-laravel-storage
解决问题就是这么一步一步的进行的,谁知道什么时候突然给你来这么一出,让你觉得自己怎么这么 sb,就没想着直接搜索下 七牛云 的依赖包。
不过,话说回来,正因为有前面的这一步步,才更深入的理解了底层的原理,而且同时也解决我上一篇里的一个疑惑:
Filesystem.php 里的 PluggableTrait 的插件的定义、使用
这在 zgldh/qiniu-laravel-storage 源码里,作者实现了,是对 Storage::xxx() 方法的一种扩展
github 地址:
https://github.com/zgldh/qiniu-laravel-storage
用法,直接参考文档,作者写的已经很详细了。
我简单测试了下,有
项目中改造:
又发现了严重的问题:
1.数据库里存储的是 '全路径地址',包含了 '域名'(我也很无语~~,应该存储为 upload/xxx/xxx.jpg,这样不论本地、还是线上或者切换其他 CDN,都方便)
2.旧版数据,有部分,还直接使用的是微信的头像,可能会包含 'http' 开头的,得区分
开始改造:
1.七牛云存储,配置,参考:zgldh/qiniu-laravel-storage
2.项目公共上传方法的修改,改造成:文件存储模式
/**
* 文件上传
*/
if ( !function_exists('file_upload')) {
function file_upload($file_input_name, $allow_extensions = ['jpg', 'jpeg', 'png', 'gif'])
{
if ( ! $file_input_name) {
return error(1, '未传入文件表单名!');
}
if ( ! Request::hasFile($file_input_name)) {
return error(1, '上传文件不存在!');
}
$file = Request::file($file_input_name);
if ( ! $file->isValid()) {
return error(1, '文件上传过程出错!');
}
$extension = strtolower($file->guessClientExtension());
// $extension = strtolower($file->getClientOriginalExtension());
if ( ! in_array($extension, $allow_extensions)) {
return error(1, '文件后缀错误!');
}
// 获取附件相关信息
$attachment_info = [
'name' => $file->getClientOriginalName(),
'size' => $file->getClientSize(),
'extention' => $extension,
'mime' => $file->getClientMimeType(),
];
// 如果是我们允许上传的图片类型,获取图片宽、高
if(in_array($extension, ['jpg', 'jpeg', 'png', 'gif'])){
$image_size = getimagesize($file->getPathname());
$attachment_info['image_width'] = isset($image_size[0]) ? $image_size[0] : 0;
$attachment_info['image_height'] = isset($image_size[1]) ? $image_size[1] : 0;
}
// 文件上传路径
$file_path = 'uploads/' . date('Y-m');
// 文件名
$file_name = date('YmdHis') . mt_rand(100, 999) . '.' . $extension;
try {
// 上传成功,返回的文件路径+文件名
$return_path = $file->storeAs($file_path, $file_name);
// 获取访问路径
$url = Storage::url($return_path);
} catch (\Exception $e) {
return error(1, '上传异常!请联系聘学兼优工作人员!');
} catch (\Throwable $e) {
return error(1, '上传异常!请联系聘学兼优工作人员!');
}
$attachment_info['file_path'] = $return_path;
$attachment_info['url'] = $url;
return error(0, '上传成功!', $attachment_info);
}
}
3.项目中所有静态文件,css、js、images,以及上传的图片,获取访问路径,添加公共函数:
/**
* 获取静态文件&上传文件访问路径
*/
if ( !function_exists('cdn_url')) {
function cdn_url($path, $disk = null)
{
// 传递 $path 可能为 '微信头像'
if(strpos($path, 'http') !== false){
return $path;
}
// 传递 $path 可能为 'base64' 图片详情
if(strpos($path, 'base64') !== false){
return $path;
}
return Storage::disk($disk)->url($path);
}
}
4.写脚本,将数据库里,有关七牛云上传的文件,全部去除域名前缀,例如:
http://7xwdxi.com1.z0.glb.clouddn.com/uploads/2018-08/xxx.jpeg
改为:
uploads/2018-08/xxx.jpeg
(
另外,之前的笔记提到过,新创建个 '空间',来删除额外的很多废图,想重新把相关的文件,导入到新空间!!!(这个过程可能比较麻烦)
)
执行 sql 语句,批量去除前缀:
$prefix = 'http://7xwdxi.com1.z0.glb.clouddn.com/';
$prefix_length = strlen($prefix);
DB::statement("update attachments set path=right(path, length(path)-{$prefix_length}) where path like '%{$prefix}%'");
... 所有表 ...
注意:
从数据库中获取所有真实使用的七牛云文件,使用 qshell 从源空间迁移到新空间(仅限于同区域):
qshell batchcopy <源空间名> <目标空间名> <源文件名和目标文件名映射列表,使用 \t 分隔。无需重命名,则不用添加目标文件名列表>
对于跨区的空间迁移,只能通过七牛云控制台里的 '跨区域同步管理'。
为了删除废弃文件,我是先使用 '跨区域同步管理',同步到 'tmp' 空间(同我们的目标空间,在一个区域),然后再执行 qshell batchcopy 导入我们需要的文件
5.项目中所有静态文件,css、js、images,使用 qshell 也迁移到七牛云
这个步骤已经实现,参考笔记1
6.接下来最麻烦的是:
将项目中所有的 css、js、images等引用,全部使用 cdn_url() 来替换!!!
全站改造,相当麻烦,整体上没有问题,细节需要结合项目自身修改!
七牛云相关文档,总算结束了,自己项目改造,应该2天左右就能结束!希望到时候访问速度快点!