如何在Laravel中读取Google Cloud Storage中的私有文件?
Laravel访问Google Cloud Storage私有文件的解决方案
第一步:配置GCS文件系统驱动
- 首先安装GCS适配扩展包,执行命令:
composer require league/flysystem-google-cloud-storage - 把你持有的
cide.json服务账号密钥文件放到项目的storage/app/目录下,禁止放在public可访问目录,避免密钥泄露 - 修改
config/filesystems.php配置文件,新增GCS磁盘配置项:
'disks' => [ // 原有其他磁盘配置保留 'gcs' => [ 'driver' => 'gcs', 'project_id' => env('GOOGLE_CLOUD_PROJECT_ID', '你的GCP项目ID'), 'key_file' => storage_path('app/cide.json'), 'bucket' => env('GOOGLE_CLOUD_STORAGE_BUCKET', '你的GCS存储桶名称'), 'path_prefix' => env('GOOGLE_CLOUD_STORAGE_PATH_PREFIX', null), 'storage_api_uri' => env('GOOGLE_CLOUD_STORAGE_API_URI', null), ], ]
- 在项目
.env文件中补充对应的GCP项目ID、存储桶名称参数即可完成配置
第二步:生成私有文件临时访问URL(推荐方案)
私有文件不支持直接公开访问,你可以通过Laravel自带的Storage门面生成带签名的临时访问URL,有效期内可直接用于前端图片、视频资源的加载展示,示例代码:
use Illuminate\Support\Facades\Storage; // 从本地数据库读取你存储的对应文件名 $filename = '用户上传的媒体文件名.png'; // 生成1小时有效期的临时访问链接 $accessUrl = Storage::disk('gcs')->temporaryUrl( $filename, now()->addHour() );
前端直接将生成的$accessUrl赋值给img标签的src属性、video标签的src属性即可正常加载资源。
可选方案:Laravel代理访问私有文件
如果需要在返回媒体资源前做额外的权限校验(比如判断当前用户是否为该资源的所有者),可以使用代理访问方案:
- 新增路由:
Route::get('/media/{filename}', [MediaController::class, 'show'])->middleware('auth');
- 控制器逻辑示例:
public function show($filename) { // 权限校验:判断当前文件是否属于登录用户 $media = Media::where('filename', $filename)->where('user_id', auth()->id())->firstOrFail(); // 读取GCS文件内容 $fileContent = Storage::disk('gcs')->get($filename); // 获取文件MIME类型 $mimeType = Storage::disk('gcs')->mimeType($filename); // 返回媒体资源响应 return response($fileContent, 200, [ 'Content-Type' => $mimeType, 'Content-Disposition' => 'inline; filename="'.$filename.'"' ]); }
注意事项
cide.json为GCP服务账号权限凭证,禁止提交到代码仓库,禁止对外泄露- 临时URL有效期可根据业务需求调整,不建议设置过长避免资源被未授权访问
- 大体积视频文件优先使用临时URL方案,代理访问会占用Laravel服务器带宽,高并发场景下性能表现较差
内容的提问来源于stack exchange,提问作者Dmitryadam
相关产品推荐
相关产品推荐

