Laravel10集成masbug/flysystem-google-drive-ext失效,求解决方案
Laravel 10 适配 Google Drive 集成解决方案
一、升级依赖包
首先更新 composer.json 中的依赖,适配 Laravel 10 及 Flysystem 3.x 版本要求:
{ "require": { "masbug/flysystem-google-drive-ext": "^3.0", "google/apiclient": "^2.15" } }
执行依赖更新命令:
composer update
二、配置文件系统
修改 config/filesystems.php,添加 Google Drive 驱动配置:
'disks' => [ // ... 保留原有其他驱动配置 'google' => [ 'driver' => 'google', 'clientId' => env('GOOGLE_DRIVE_CLIENT_ID'), 'clientSecret' => env('GOOGLE_DRIVE_CLIENT_SECRET'), 'refreshToken' => env('GOOGLE_DRIVE_REFRESH_TOKEN'), 'folderId' => env('GOOGLE_DRIVE_FOLDER_ID'), // 可选,默认使用根目录 ], ],
在 .env 文件中补充对应环境变量:
GOOGLE_DRIVE_CLIENT_ID=你的客户端ID GOOGLE_DRIVE_CLIENT_SECRET=你的客户端密钥 GOOGLE_DRIVE_REFRESH_TOKEN=你的刷新令牌 GOOGLE_DRIVE_FOLDER_ID=1zQA5vLXEOnDVQ9ePPKfyiXUPbPxfJhT_
三、重写控制器代码
原控制器手动初始化客户端、适配器的方式已不适配新版本,改用 Laravel 原生 Storage 门面操作,代码更简洁且符合框架规范:
<?php namespace App\Admin\Controllers; use App\Admin\AdminController; use Illuminate\Support\Facades\Storage; use League\Flysystem\FilesystemException; class GoogleDriveController extends AdminController { protected $googleDisk; public function __construct() { $this->googleDisk = Storage::disk('google'); } /** * 在指定父文件夹下创建子文件夹 */ public function create_folder_in_parent(string $folderName, string $parentFolderID): string { try { $folder = $this->googleDisk->createDirectory($parentFolderID . '/' . $folderName); return $folder['id']; } catch (FilesystemException $e) { abort(500, '创建文件夹失败:' . $e->getMessage()); } } /** * 检查指定文件夹下是否存在目标文件夹 */ public function check_if_folder_exists(string $folderName, string $folderID): bool { try { $contents = $this->googleDisk->listContents($folderID, true); foreach ($contents as $item) { if ($item['type'] === 'dir' && $item['basename'] === $folderName) { return true; } } return false; } catch (FilesystemException $e) { abort(500, '查询文件夹失败:' . $e->getMessage()); } } /** * 上传图片到指定文件夹 */ public function upload_image(string $todayFolderID, string $imageContent, string $imageName): array { try { $path = $todayFolderID . '/' . $imageName; $this->googleDisk->write($path, $imageContent); return $this->googleDisk->getMetadata($path); } catch (FilesystemException $e) { abort(500, '上传图片失败:' . $e->getMessage()); } } /** * 获取文件共享链接 */ public function getShareableLink(string $fileID): string { try { $metadata = $this->googleDisk->getMetadata($fileID); return $metadata['url']; } catch (FilesystemException $e) { abort(500, '获取共享链接失败:' . $e->getMessage()); } } /** * 删除指定文件名的重复文件 */ protected function remove_duplicated(string $fileName): void { try { $contents = $this->googleDisk->listContents('/', true); foreach ($contents as $item) { if ($item['type'] === 'file' && $item['basename'] === $fileName) { $this->googleDisk->delete($item['path']); } } } catch (FilesystemException $e) { abort(500, '删除重复文件失败:' . $e->getMessage()); } } /** * 上传本地存储文件到 Google Drive */ public function upload_files(): void { try { $files = Storage::files(); foreach ($files as $file) { $fileName = basename($file); $this->remove_duplicated($fileName); $fileContent = Storage::get($file); $this->upload_image(env('GOOGLE_DRIVE_FOLDER_ID'), $fileContent, $fileName); Storage::delete($file); } } catch (FilesystemException $e) { abort(500, '批量上传失败:' . $e->getMessage()); } } /** * 统计指定文件夹下的文件数量 */ public function files_count(): int { try { $contents = $this->googleDisk->listContents(env('GOOGLE_DRIVE_FOLDER_ID'), true); return count(array_filter($contents, fn($item) => $item['type'] === 'file')); } catch (FilesystemException $e) { abort(500, '统计文件数量失败:' . $e->getMessage()); } } }
关键改动说明
- 移除手动初始化
Google_Client、GoogleDriveAdapter等代码,改用 Laravel 配置驱动的方式,符合框架设计规范 - 使用 Laravel 原生
Storage门面操作文件系统,自动处理适配器和客户端的生命周期 - 添加异常捕获处理,提升代码健壮性
- 适配 Flysystem 3.x 的 API 规范(原部分方法逻辑已变更)
内容的提问来源于stack exchange,提问作者VIKAS KATARIYA
相关产品推荐
相关产品推荐

