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




