当前位置: 首页 > 工具软件 > qiniu-js > 使用案例 >

laravel 使用 qiniu-laravel-storage 七牛云存储依赖包,改造项目

糜鸿风
2023-12-01
接着上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天左右就能结束!希望到时候访问速度快点!

 

 类似资料: