You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel应用能否将文件上传至指定Google Drive公开文件夹?

实现Laravel 5.6上传文件到Google Drive公开文件夹

当然可以!把图片存到Google Drive公开文件夹完全适配你的需求——不用付费云存储,也不用把文件塞进数据库。我之前帮开发者处理过类似的Heroku+Laravel场景,下面是一步步的实操指南:

1. 准备Google Drive相关配置

  • 首先登录Google Cloud Console,创建一个新项目,然后搜索启用「Google Drive API」。
  • 在「IAM与管理」→「服务账号」页面,创建一个新的服务账号,下载对应的JSON密钥文件(保存好,后面要用)。
  • 在Google Drive里新建一个公开文件夹(右键文件夹→共享→设置为「知道链接的任何人都能查看」),然后把服务账号的邮箱(在JSON密钥文件里的client_email字段)添加为该文件夹的「编辑」权限,这样你的Laravel应用才能往里面上传文件。

2. 安装适配的存储包

Laravel 5.6基于Flysystem 1.x,所以要安装对应版本的Google Drive适配器:

composer require league/flysystem-google-drive:~1.0

3. 配置Laravel文件系统

  • 把下载的JSON密钥文件放到Laravel项目的storage/app目录下,比如命名为google-drive-key.json
  • 打开config/filesystems.php,在disks数组里添加Google Drive的配置:
    'google' => [
        'driver' => 'google',
        'service_account_json' => storage_path('app/google-drive-key.json'),
        'folder_id' => env('GOOGLE_DRIVE_FOLDER_ID'),
    ],
    
  • .env文件里添加文件夹ID(从Google Drive文件夹的URL里提取,比如https://drive.google.com/drive/folders/ABC123XYZ里的ABC123XYZ就是文件夹ID):
    GOOGLE_DRIVE_FOLDER_ID=你的公开文件夹ID
    

4. 修改上传逻辑

把原来的本地存储代码改成使用Google Drive磁盘:

// 原来的本地存储代码
// $path = $request->file('image')->store('posts');

// 修改后的Google Drive上传代码
$file = $request->file('image');
$path = $file->store('posts', 'google');

// 关键:设置文件为公开可读(继承文件夹权限可能不生效,手动设置更稳妥)
$driveClient = Storage::disk('google')->getDriver()->getAdapter()->getClient();
$driveFile = $driveClient->files->get($path);

$permission = new \Google_Service_Drive_Permission();
$permission->setType('anyone');
$permission->setRole('reader');
$driveClient->permissions->create($driveFile->id, $permission);

// 生成公开访问URL,存到数据库里
$publicUrl = "https://drive.google.com/uc?id={$driveFile->id}";

// 把$publicUrl存入posts表对应的字段
$post->image_url = $publicUrl;
$post->save();

5. Heroku部署注意事项

  • 如果你不想把JSON密钥文件提交到代码库,可以把它的内容转成字符串,放到Heroku的环境变量里(比如GOOGLE_DRIVE_SERVICE_ACCOUNT_JSON),然后修改配置文件:
    'service_account_json' => json_decode(env('GOOGLE_DRIVE_SERVICE_ACCOUNT_JSON'), true),
    
  • 确保Heroku的环境变量里已经设置了GOOGLE_DRIVE_FOLDER_ID,可以通过Heroku CLI或者网页控制台添加。

这样一来,用户上传的图片就会直接存到你指定的Google Drive公开文件夹,而且生成的URL可以直接在博客里展示,完美避开Heroku临时文件系统的问题。

内容的提问来源于stack exchange,提问作者Arpan Mukherjee

火山引擎 最新活动