0

0

解决GoogleDrive文件路径混乱问题:使用flysystem-google-drive-ext实现无缝路径转换

WBOY

WBOY

发布时间:2025-06-16 08:17:31

|

246人浏览过

|

来源于php中文网

原创

可以通过一下地址学习composer学习地址

在使用 google drive 作为应用程序的存储后端时,我们很快会遇到一个问题:google drive 使用唯一的 id 来标识每个文件和文件夹,而不是像传统文件系统那样使用直观的路径。这给集成带来了很大的麻烦,因为我们需要在应用程序中维护这些 id,并且手动进行路径转换。

例如,我们可能需要在应用程序中显示一个易于理解的路径 /My Nice Dir/myFile.ext,但在 Google Drive 中,实际的“虚拟路径”却是 /Xa3X9GlR6EmbnY1RLVTk5VUtOVkk/0B3X9GlR6EmbnY1RLVTk5VUtOVkk。手动处理这些转换不仅繁琐,而且容易出错。

masbug/flysystem-google-drive-ext 扩展包正是为了解决这个问题而生的。它是一个 Flysystem 适配器,能够无缝地在“显示路径”和“虚拟路径”之间进行转换,隐藏了 Google Drive 的内部 ID 管理,让我们可以像使用传统文件系统一样操作 Google Drive。

安装

使用 Composer 安装非常简单:

composer require masbug/flysystem-google-drive-ext

配置

首先,你需要从 Google 获取 client IDclient secretrefresh token。这些凭据用于授权你的应用程序访问 Google Drive。具体步骤可以参考 Google 官方文档。

获取到凭据后,就可以使用 Masbug\Flysystem\GoogleDriveAdapter 创建适配器实例了:

use Masbug\Flysystem\GoogleDriveAdapter;
use Google\Client;
use Google\Service\Drive;
use League\Flysystem\Filesystem;
use League\Flysystem\Config;
use League\Flysystem\Visibility;

$client = new Client();
$client->setClientId('[client_id]');
$client->setClientSecret('[client_secret]');
$client->refreshToken('[refresh_token]');
$client->setApplicationName('My Google Drive App');

$service = new Drive($client);

// 创建适配器
$adapter = new GoogleDriveAdapter($service, 'My_App_Root');

// 创建 Flysystem 实例
$fs = new Filesystem($adapter, new Config([Config::OPTION_VISIBILITY => Visibility::PRIVATE]));

在上面的代码中,My_App_Root 指定了应用程序在 Google Drive 中使用的根目录。

使用

现在,你可以像使用任何其他 Flysystem 适配器一样使用 Google Drive 了。例如,列出根目录下的所有文件和文件夹:

$contents = $fs->listContents('', true /* is_recursive */);

上传文件:

use League\Flysystem\Local\LocalFilesystemAdapter;
use Carbon\Carbon;
use League\Flysystem\UnableToWriteFile;

$local_filepath = '/home/user/downloads/file_to_upload.ext';
$remote_filepath = 'MyFolder/file.ext';

$localAdapter = new LocalFilesystemAdapter('/');
$localfs = new Filesystem($localAdapter, [Config::OPTION_VISIBILITY => Visibility::PRIVATE]);

try {
    $time = Carbon::now();
    $fs->writeStream($remote_filepath, $localfs->readStream($local_filepath), new Config());

    $speed = !(float)$time->diffInSeconds() ? 0 :filesize($local_filepath) / (float)$time->diffInSeconds();
    echo 'Elapsed time: '.$time->diffForHumans(null, true).PHP_EOL;
    echo 'Speed: '. number_format($speed/1024,2) . ' KB/s'.PHP_EOL;
} catch(UnableToWriteFile $e) {
    echo 'UnableToWriteFile!'.PHP_EOL.$e->getMessage();
}

下载文件:

use League\Flysystem\Local\LocalFilesystemAdapter;
use Carbon\Carbon;
use League\Flysystem\UnableToWriteFile;

$remote_filepath = 'MyFolder/file.ext';
$local_filepath = '/home/user/downloads/file.ext';

$localAdapter = new LocalFilesystemAdapter('/');
$localfs = new Filesystem($localAdapter, [Config::OPTION_VISIBILITY => Visibility::PRIVATE]);

try {
    $time = Carbon::now();
    $localfs->writeStream($local_filepath, $fs->readStream($remote_filepath), new Config());

    $speed = !(float)$time->diffInSeconds() ? 0 :filesize($local_filepath) / (float)$time->diffInSeconds();
    echo 'Elapsed time: '.$time->diffForHumans(null, true).PHP_EOL;
    echo 'Speed: '. number_format($speed/1024,2) . ' KB/s'.PHP_EOL;
} catch(UnableToWriteFile $e) {
    echo 'UnableToWriteFile!'.PHP_EOL.$e->getMessage();
}

在 Laravel 中使用

谱乐AI
谱乐AI

谱乐AI,集成 Suno、Udio 等顶尖AI音乐模型的一站式AI音乐生成平台。

下载

masbug/flysystem-google-drive-ext 也可以很方便地集成到 Laravel 框架中。

  1. 配置 .env 文件:

    .env 文件中添加 Google Drive 的凭据:

    FILESYSTEM_CLOUD=google
    GOOGLE_DRIVE_CLIENT_ID=xxx.apps.googleusercontent.com
    GOOGLE_DRIVE_CLIENT_SECRET=xxx
    GOOGLE_DRIVE_REFRESH_TOKEN=xxx
    GOOGLE_DRIVE_FOLDER=
  2. 配置 config/filesystems.php 文件:

    config/filesystems.php 文件中添加一个名为 google 的 disk:

    'disks' => [
        // ...
        'google' => [
            'driver' => 'google',
            'clientId' => env('GOOGLE_DRIVE_CLIENT_ID'),
            'clientSecret' => env('GOOGLE_DRIVE_CLIENT_SECRET'),
            'refreshToken' => env('GOOGLE_DRIVE_REFRESH_TOKEN'),
            'folder' => env('GOOGLE_DRIVE_FOLDER'), // without folder is root of drive or team drive
        ],
        // ...
    ],
  3. 注册 Service Provider:

    app/Providers/AppServiceProvider.php 文件中,添加以下代码:

    namespace App\Providers;
    
    use Illuminate\Support\Facades\Storage;
    use Illuminate\Support\ServiceProvider;
    use League\Flysystem\Filesystem;
    use Masbug\Flysystem\GoogleDriveAdapter;
    use Google\Client;
    use Google\Service\Drive;
    use Illuminate\Filesystem\FilesystemAdapter;
    
    class AppServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            Storage::extend('google', function ($app, $config) {
                $client = new Client();
                $client->setClientId($config['clientId']);
                $client->setClientSecret($config['clientSecret']);
                $client->refreshToken($config['refreshToken']);
                $service = new Drive($client);
                $adapter = new GoogleDriveAdapter($service, $config['folder'] ?? '/');
                $driver = new Filesystem($adapter);
    
                return new FilesystemAdapter($driver, $adapter);
            });
        }
    }

现在,你可以像这样访问 Google Drive:

use Illuminate\Support\Facades\Storage;

$googleDisk = Storage::disk('google');

// 上传文件
$googleDisk->put('MyFolder/file.ext', file_get_contents('/path/to/local/file.ext'));

// 下载文件
$contents = $googleDisk->get('MyFolder/file.ext');

优势

  • 无缝路径转换: 自动处理 Google Drive 的虚拟路径和显示路径之间的转换,简化了开发过程。
  • 易于集成: 可以轻松地集成到现有的 Flysystem 代码中。
  • 支持 Team Drive: 支持连接到 Team Drive,方便团队协作。
  • 支持共享文件夹: 支持连接到与您共享的文件夹。
  • 流式上传/下载: 支持直接从流中上传和下载文件,避免将数据复制到内存中,提高了性能。

局限性

  • 重复文件名: Google Drive 允许用户创建具有相同显示名称的文件和文件夹。在这种情况下,适配器会选择最旧的实例。
  • 并发使用: 并发使用同一个 Google Drive 可能会导致意外问题,因为文件/文件夹标识符和文件对象会被大量缓存。

总结

masbug/flysystem-google-drive-ext 扩展包是一个强大的工具,可以帮助我们更轻松地将应用程序与 Google Drive 集成。它通过无缝的路径转换,简化了文件管理,提高了开发效率。如果你正在使用 Google Drive 作为应用程序的存储后端,那么这个扩展包绝对值得一试。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2513

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1597

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1491

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1416

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
第二十四期_PHP8编程
第二十四期_PHP8编程

共86课时 | 3.4万人学习

成为PHP架构师-自制PHP框架
成为PHP架构师-自制PHP框架

共28课时 | 2.4万人学习

第二十三期_PHP编程
第二十三期_PHP编程

共93课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号