You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:40:58